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)
将取消引用它