C语言新手求助:如何编写支持可变字符串参数的打印计数函数
问题分析
你当前的代码存在两个核心问题,无法实现预期功能:
- 直接取第一个固定参数的地址遍历后续可变参数属于未定义行为:C标准没有约定可变参数和固定参数在内存中连续存储,受编译器、架构、调用约定影响,栈布局没有统一标准,该写法不具备可移植性,运行时大概率出现乱码、崩溃问题。
(*p)++逻辑错误:该操作是将当前指向字符串的char*指针向后偏移1字节,指向字符串的下一个字符,而非移动到下一个传入的参数。
正确实现
C语言标准提供了<stdarg.h>头文件,封装了可变参数的操作逻辑,跨平台兼容,实现代码如下:
#include <stdio.h> #include <stdarg.h> // 函数返回值为传入的字符串总数量 int PrintAndCount(const char* first, ...) { int count = 0; va_list arg_ptr; // 初始化可变参数列表,第二个参数为最后一个固定参数 va_start(arg_ptr, first); const char* current_str = first; while (current_str != NULL) { printf("%s\n", current_str); count++; // 取下一个可变参数,指定参数类型为const char* current_str = va_arg(arg_ptr, const char*); } // 清理可变参数列表资源 va_end(arg_ptr); return count; } int main() { char s1[] = "It was a bright cold day in April."; char s2[] = "The hallway smelt of boiled cabbage and old rag mats. "; char s3[] = "It was no use trying the lift."; int total_num = PrintAndCount(s1, s2, s3, NULL); printf("传入的字符串总数量:%d\n", total_num); return 0; }
核心注意点
va_list是用于存储可变参数位置信息的专属类型va_start必须和va_end成对使用,避免资源泄漏va_arg取参数时必须传入和实际参数一致的类型,否则会出现读取错误
内容的提问来源于stack exchange,提问作者xxx
相关产品推荐
相关产品推荐

