2016-05-31 89 views
1

我想實現我自己的printf,我有一個問題處理寬字符%Sva_arg在C中有寬字符,如何處理%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')[-Wformat] 的printf(「%S \ n「,va_arg(arg,wchar_t));

當我使用下面的代碼printf工作正常。

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

回答

3

您傳遞一個指針並檢索一個整數。 L"Some String"va_arg(arg, wchar_t)的類型不匹配。

檢索指針代替:

va_arg(arg, wchar_t*) 

*traverse++;是不正確的,則解除引用是多餘的。它應該是簡單的:traverse++;


在一個側面說明,你的代碼沒有做任何輸入檢查和惡意字符串將導致未定義的行爲。如果字符'%'是最後一個字符,則會發生這種情況,迭代器traverse將指向數組中最後一個元素之外的一個字符,並且檢查while (*traverse)將取消引用它。