#include <stdio.h> #include <stdlib.h> #include <stdarg.h> int My_Printf(char *str,...); int My_Printf(char *str,...) { char char_num[8];//存放 整形数据,整形数据不能用printf输出,不然模拟printf就没意义,转成字符再输出 va_list arg;//定义参数列表(这个列表是用来存放你传过来的参数 va_start(arg,str);//初始化参数列表 char *tmp = str; while(*tmp!='\0') { if(*tmp == '%') { tmp++; switch (*tmp) { case 'd' : sprintf(char_num,"%d",va_arg(arg,int));//检索获取...对应的整形数据并转成字符 fwrite(char_num,7,1,stdout);//显示字符 这个是显示,但是又不能用printf break; case 'c' : putchar(va_arg(arg, int)); break; //检索获取...中对应的字符数据并且用putchar输出,按系统要求,也是按4个字节获取数据char提升为int case 's' : puts(va_arg(arg,char *)); break;//检索获取...中对应的字符串数据并且用puts输出 case '\n': putchar('\n'); //如果是\n则换行输出 default: break; } } else { putchar(*tmp);//输出普通字符 } tmp++; } va_end(arg);//va_end将arg指针设为空。 return 0; } int main() { My_Printf("My name is %s","Peter"); My_Printf("I have %d dollars\n",1000000); return 0; }
时间: 2024-04-18 13:26:36 浏览: 141
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
这段代码是一个简单的模拟实现 `printf` 函数的 `My_Printf` 函数。它接受一个格式字符串和可变数量的参数,并根据格式字符串的指示进行输出。
在 `My_Printf` 函数中,使用了 `stdarg.h` 头文件中提供的宏和函数来处理可变数量的参数。具体的实现步骤如下:
1. 定义一个字符数组 `char_num`,用于存储转换后的整型数据。
2. 使用 `va_list` 类型的变量 `arg` 来存放传递给函数的参数列表,通过 `va_start(arg, str)` 宏进行初始化。
3. 使用一个指针 `tmp` 来遍历格式字符串 `str`,并进行相应的处理。
4. 如果当前字符是 `%`,则表示需要进行格式化输出。
- 如果下一个字符是 `d`,则使用 `va_arg(arg, int)` 检索获取对应的整型数据,并使用 `sprintf` 将其转换为字符形式存储在 `char_num` 中,然后使用 `fwrite` 输出。
- 如果下一个字符是 `c`,则使用 `va_arg(arg, int)` 检索获取对应的字符数据,并使用 `putchar` 输出。
- 如果下一个字符是 `s`,则使用 `va_arg(arg, char *)` 检索获取对应的字符串数据,并使用 `puts` 输出。
- 如果下一个字符是 `\n`,则直接使用 `putchar('\n')` 输出换行。
5. 如果当前字符不是 `%`,则直接使用 `putchar` 输出当前字符。
6. 遍历完格式字符串后,使用 `va_end(arg)` 将参数列表清空。
7. 返回 0。
在 `main` 函数中,我们调用了 `My_Printf` 函数来进行输出。第一次调用输出了 "My name is Peter",第二次调用输出了 "I have 1000000 dollars"。
需要注意的是,这个实现只是一个简单的模拟,可能没有考虑到 `printf` 函数的所有功能和细节,并且对于不同平台和编译器可能会有差异。真正的 `printf` 函数实现更加复杂和全面。
阅读全文