繁体   English   中英

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

[英]va_arg with wide char in c, how to handle %S

我正在尝试实现自己的printf ,我有一个处理宽char %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);
}

警告:format指定类型'wchar_t *'(又名'int *'),但参数的类型为'wchar_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++; 不正确,取消引用是多余的。 它应该是简单的: traverse++;


另外,您的代码不会进行任何输入检查,恶意字符串将导致未定义的行为。 如果字符'%'是最后一个字符,迭代器traverse将指向超出数组中最后一个元素的一个,而check while (*traverse)将取消引用它,则会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM