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

c中带有宽字符的va_arg,如何处理%S,c,C,我正在尝试实现我自己的printf,我在处理宽字符%S时遇到了一个问题 void my_printf(char *format, ...) { char *traverse; va_list arg; va_start(arg, format); traverse = format; while (*traverse) { if (*traverse == '%') {

我正在尝试实现我自己的
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\u t*”(也称为“int*”),但参数的类型为“wchar\u t”(也称为“int”)[-Wformat] printf(“%S\n”,va_arg(arg,wchar_t))

当我使用以下代码时,
printf
工作正常

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

您正在传递一个指针并检索一个整数。
L“Some String”
va_arg(arg,wchar_t)
的类型不匹配

取而代之的是检索指针:

 va_arg(arg, wchar_t*)

行<代码>*遍历++不正确,取消引用是多余的。它应该很简单:
traverse++


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