我试图实现自己的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");
答案 0 :(得分:3)
您正在传递指针并检索整数。 python
和L"Some String"
的类型不匹配。
改为检索指针:
va_arg(arg, wchar_t)
行 va_arg(arg, wchar_t*)
不正确,取消引用是多余的。它应该是简单的:*traverse++;
另一方面,您的代码不进行任何输入检查,恶意字符串将导致未定义的行为。如果字符traverse++;
是最后一个字符,迭代器'%'
将指向数组中最后一个元素之外的一个字符,而traverse
检查将取消引用它。