• 99,printf scanf手动功能实现


    不知道大伙有没有注意到.
    我们使用的scanf和printf,参数的个数可以自己输入,是不确定的.

    而使用其他的大部分函数,参数个数都是固定的.

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stdarg.h>
    int f_add(int p_v1, int p_v2) {
     return p_v1 + p_v2;
    }

    //这样子,我们就实现了任意多个参数进行相加的一个函数.
    //第一个参数为后面所有参数的个数.
    int f_add_ex(int p_count, ...) {
     int l_sum = NULL;
     va_list l_va = NULL;  // int * p = NULL;
     va_start(l_va, p_count);// p = &p_count;
     for (size_t i = 0; i < p_count; i++) {
      l_sum += va_arg(l_va, int);  //  p++   l_sum=l_sum + *p;
     }
     va_end(l_va); // l_va = NULL;

     return l_sum;
    }

    void main() {
     int l_sum = NULL;
     l_sum = f_add_ex(9, 1, 2, 3, 4, 5, 6, 7, 8, 9);
     printf("sum is %d ", l_sum);
     system("pause");
    }


    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stdarg.h>
    int f_add(int p_v1, int p_v2) {
     return p_v1 + p_v2;
    }

    //这样子,我们就实现了任意多个参数进行相加的一个函数.
    //第一个参数为后面所有参数的个数.
    int f_add_ex(int p_count, ...) {
     //int l_sum = null;
     //va_list l_va = null;  // int * p = null;
     //va_start(l_va, p_count);// p = &p_count;
     //for (size_t i = 0; i < p_count; i++) {
     // l_sum += va_arg(l_va, int);  //  p++   l_sum=l_sum + *p;
     //}
     //va_end(l_va); // l_va = null;

     //return l_sum;

     int l_sum = NULL;
     char * p = NULL;
     p = (char *)&p_count;
     p = p + 4;
     for (size_t i = 0; i < p_count; i++) {
      l_sum = l_sum + *(int *)p;
      p = p + 4;
     }
     p = NULL;
     return l_sum;
    }

    void main() {
     int l_sum = NULL;
     l_sum = f_add_ex(9, 1, 2, 3, 4, 5, 6, 7, 8, 9);
     printf("sum is %d ", l_sum);
     system("pause");
    }


    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stdarg.h>
    int f_add(int p_v1, int p_v2) {
     return p_v1 + p_v2;
    }

    //这样子,我们就实现了任意多个参数进行相加的一个函数.
    //第一个参数为后面所有参数的个数.
    int f_add_ex(int p_count, ...) {
     //int l_sum = null;
     //va_list l_va = null;  // int * p = null;
     //va_start(l_va, p_count);// p = &p_count;
     //for (size_t i = 0; i < p_count; i++) {
     // l_sum += va_arg(l_va, int);  //  p++   l_sum=l_sum + *p;
     //}
     //va_end(l_va); // l_va = null;

     //return l_sum;

     int l_sum = NULL;
     char * p = NULL;
     p = (char *)&p_count;
     p = p + 4;
     for (size_t i = 0; i < p_count; i++) {
      l_sum = l_sum + *(int *)p;
      p = p + 4;
     }
     p = NULL;
     return l_sum;
    }

    void printf_str(char * p_buffer) {
     int l_length = strlen(p_buffer);
     for (size_t i = 0; i < l_length; i++) {
      putchar(p_buffer[i]);
     }
    }

    //printf("abc");
    //printf("%d",数字);
    //printf("%f",浮点数)
    //printf("%%");
    //printf("%s",字符串指针);
    void my_printf(char * p_format, ...) { //传址
     int l_length = strlen(p_format);
     va_list l_va = NULL;  // char * l_va = NULL;
     va_start(l_va, p_format);//l_va = &p_format;  l_va+=4;
     /*char * l_va = NULL;
     l_va = (char *)&p_format;
     l_va += 4;*/

     char l_temp[50] = { 0 };

     for (size_t i = 0; i < l_length; i++) {
      if (p_format[i] != '%') {
       putchar(p_format[i]);
      }
      else {
       i++;
       switch (p_format[i]) {
       case '%':
        putchar('%');
        break;
       case 'd':
        sprintf(l_temp, "%d", va_arg(l_va, int));
        printf_str(l_temp);
        break;
       case 'f':
        sprintf(l_temp, "%f", va_arg(l_va, float));
        printf_str(l_temp);
        break;
       case 's':
        printf_str((char *)va_arg(l_va, int));
        break;
       }
      }
     }

     va_end(l_va);

    }

    void main() {
     char l_test[] = "极客编程!";
     my_printf("你好朋友 %d %s", 100 * 100, l_test);
     system("pause");
    }

  • 相关阅读:
    多层感知机的简洁实现
    汇编语言总结(1)
    回顾下TCP/IP协议
    五笔输入法的前世今生
    大O算法
    算法基础概念
    TCP和UDP的区别
    数据结构基本概念和术语
    gdb调试方法
    GD32F20x系列使用问题总结
  • 原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/9175224.html
Copyright © 2020-2023  润新知