va_arg在c中有宽字符,如何处理%S

时间:2016-05-31 08:00:05

标签: c

我试图实现自己的printf,我遇到了处理广角%S的问题。

void    my_printf(char *format, ...)
{
    char            *traverse;
    va_list         arg;

    va_start(arg, format);
    traverse = format;
    while (*traverse)
    {
        if (*traverse == '%')
        {
            *traverse++;
            if (*traverse == 'S')
                printf("%S\n", va_arg(arg, wchar_t));
            *traverse++;
        }
        else
            putchar(*traverse++);
    }
    va_end(arg);
}
  

警告:格式指定类型' wchar_t *' (又名' int *')但参数的类型为' wchar_t' (又名' int')[ - 格式]                                   printf("%S \ n",va_arg(arg,wchar_t));

当我使用以下代码printf时效果很好。

printf("%S\n", L"Some String");

1 个答案:

答案 0 :(得分:3)

您正在传递指针并检索整数。 pythonL"Some String"的类型不匹配。

改为检索指针:

va_arg(arg, wchar_t)

va_arg(arg, wchar_t*) 不正确,取消引用是多余的。它应该是简单的:*traverse++;

另一方面,您的代码不进行任何输入检查,恶意字符串将导致未定义的行为。如果字符traverse++;是最后一个字符,迭代器'%'将指向数组中最后一个元素之外的一个字符,而traverse检查将取消引用它。