You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:06:04