stdarg.h 是 C 编程语言中的一个头文件,它提供了一个机制,用于函数接受可变数量的参数。“stdarg” 这个名字代表 “standard arguments”(标准参数),这个头文件通常用于创建可以接受不同数量参数的函数,比如 printf 和 scanf 函数。
在 C 中,函数通常具有固定数量的参数,在函数声明时就已经定义好了。然而,有些情况下,你可能希望创建一个能够每次调用时接受不同数量参数的函数。这就是 stdarg.h 的用途。
要使用可变参数功能,需要在参数列表中使用 … 省略号。例如:
#include
int my_printf(const char *format, ...);
在函数定义中,你可以使用 stdarg.h 中的宏来处理可变参数。以下是一个实现基本 my_printf 函数的简单示例:
#include
#include
int my_printf(const char *format, ...) {
va_list args;
va_start(args, format);
while (*format != '\0') {
if (*format == '%') {
format++;
switch (*format) {
case 'd':
printf("%d ", va_arg(args, int));
break;
case 's':
printf("%s ", va_arg(args, char *));
break;
// 根据需要为其他格式说明符添加更多的情况
default:
putchar(*format);
}
} else {
putchar(*format);
}
format++;
}
va_end(args);
return 0;
}
在定义函数后,你可以像使用任何其他可变参数函数一样使用它:
int main() {
my_printf("你好,%s!答案是 %d。\n", "小明", 42);
return 0;
}
使用 stdarg.h 需要小心处理参数,以避免未定义的行为或与内存相关的问题。
在 C 语言中,printf 函数用于格式化输出到标准输出(通常是终端窗口)。
int printf(const char *format, ...);
#include
#include
int my_printf(const char *format, ...) {
va_list args;
va_start(args, format);
int count = 0; // 用于记录输出的字符数
while (*format != '\0') {
if (*format == '%') {
format++;
switch (*format) {
case 'd':
count += printf("%d", va_arg(args, int));
break;
case 's':
count += printf("%s", va_arg(args, char *));
break;
default:
putchar(*format);
count++;
}
} else {
putchar(*format);
count++;
}
format++;
}
va_end(args);
return count; // 返回输出的字符数
}
int main() {
int num = 42;
char str[] = "Hello, World!";
int printed = my_printf("Number: %d, String: %s\n", num, str);
printf("Total characters printed: %d\n", printed);
return 0;
}
在 C 语言中,scanf 函数用于从标准输入(通常是终端窗口)读取格式化输入。
int scanf(const char *format, ...);
#include
#include
int my_scanf(const char *format, ...) {
va_list args;
va_start(args, format);
int count = 0; // 用于记录成功读取的输入项数
while (*format != '\0') {
if (*format == '%') {
format++;
switch (*format) {
case 'd': {
int *num = va_arg(args, int *);
if (scanf("%d", num) == 1) {
count++;
}
break;
}
case 's': {
char *str = va_arg(args, char *);
if (scanf("%s", str) == 1) {
count++;
}
break;
}
default:
// 忽略格式说明符之外的字符
getchar(); // 清除非法字符
}
} else {
// 忽略格式说明符之外的字符
getchar(); // 清除非法字符
}
format++;
}
va_end(args);
return count; // 返回成功读取的输入项数
}
int main() {
int num;
char str[100];
printf("Enter a number: ");
int numRead = my_scanf("%d", &num);
printf("Number read: %d\n", num);
printf("Items read: %d\n", numRead);
printf("Enter a string: ");
int strRead = my_scanf("%s", str);
printf("String read: %s\n", str);
printf("Items read: %d\n", strRead);
return 0;
}