va_list中的未知字符?

Luk*_*uka 1 c++

#include <stdio.h>
#include <stdarg.h>

void s(const char* param, ...)
{
    va_list arguments;
    va_start (arguments, param);
    const char* param_now = va_arg(arguments, const char*);

    while(param_now != NULL)
    {
        printf("%s", param_now);
        param_now = va_arg(arguments, const char*);
    }

    va_end (arguments);
}

int main()
{
    s("one", "two");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我上面的代码不起作用并显示未知符号而不是一个和两个?

编辑:找到一种非常聪明的方法来避免在最后包含NULL:

void add_s(const char* param, ...)
{
    return s(param, NULL);
}
Run Code Online (Sandbox Code Playgroud)

thi*_*his 5

你永远不会用NULL参数终止你的序列,你的while循环正在检查.

s("one", "two" , NULL );
Run Code Online (Sandbox Code Playgroud)

现在只出现"两个".这是因为第一个字符串在参数中param.所以你必须先打印它,然后打印所有可选参数.

您可以使用宏来避免写入NULL终止符.就像是:

#define my_s( ... )    s( __VA_ARGS__ , NULL )
Run Code Online (Sandbox Code Playgroud)

请注意,这需要至少一个参数my_s.(并考虑避免在严格的代码中使用宏)