99,printf scanf手动功能实现

Posted xiaodaxiaonao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");
}





























































































































以上是关于99,printf scanf手动功能实现的主要内容,如果未能解决你的问题,请参考以下文章

STC15利用库函数实现printf和scanf重载示例模板

手动实现iostream

C语言中的printf()与scanf()

C语言中的printf()与scanf()

编写一个c语言程序,实现录入学生学号和姓名信息的功能

J-link v9 使用技巧之虚拟串口功能