2016-05-31 13 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は配列の最後の要素を超えて1を指し、チェックwhile (*traverse)は逆参照します。

関連する問題