2011-12-30 25 views
18

コードでprintfwprintfの機能を併用すると問題があります。通常の文字列が最初に印刷される場合、wprintfは機能しません。 wprintfを最初に使用した場合、printfは機能しません。printfとwprintfを単一のCコード

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    printf("No printing!\n"); 
    wprintf(L"Printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

出力:

No printing! 
ASCII 

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    wprintf(L"Printing!\n"); 
    printf("No printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

ながら出力:

Printing! 
Wide char 

私は上のglibc 2.14と一緒にGCC(GCC)4.6.1 20110819を使用しています64ビットLinux 3.0。

+0

Linux 3.0?あれは何でしょう?どのような分布ですか? – bmargulies

+0

@bmargulies:カーネルのバージョン。配布はArchlinuxです。 –

答えて

14

これは予期されています。あなたのコードは未定義の動作を呼び出しています。 C標準では、各FILEストリームには、最初に実行された操作によって設定され、fwide関数で検査可能な「方向」(「バイト」または「ワイド」)が関連付けられています。 。未定義の動作中に流れた結果の向きと方位競合

+0

Isは未定義の動作ですか、または向きが書き込まれるデータの不一致の場合は単純に何も出力しませんか? – alk

+0

これに基づいて:http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Streams-and-I18N.html、動作は未定義です。 – DRH

+2

@alk未定義の動作は、この状況でどのように動作するべきかについての期待はないことを意味します。したがって、テキストを適切な方向に静かに変換したり、ゴミを印刷したりするなど、何も出力することはできません。 –

2

Rを補完するためには、.. '答え受け入れ(S)これは非常にまれにしか行われないもののprintf/wprintfのリターンコードをチェックし、

をより明確に示すことになりますそれらの1つが機能していないことを示します(ストリームの現在の方向に応じて無効な印刷機能に対しては-1を返す必要があります)。

残念ながら、標準ライブラリ関数でエラーをチェックするための一般的なパターン:ではないかもしれないストリームが出力非ワイド文字に設定されている場合、あなたはwprintfを呼び出し、errno

if (wprintf(...) == -1) { perror("wprintf"); ... } 

はずっとここに助けない場合があります多くの情報を提供していないwprintf: Successが得られます。

ストリームの文字の向きがわからないときは、実際には分かりにくい問題です。

+0

戻り値を確認すると、未定義の動作が発生したときではなく、レポート可能なエラーが発生したときに役立ちます。 'wprintf'は方向が間違っているときに失敗するように指定されていません。むしろ、方向が間違っているときの動作は*指定されていません。それは未定義の意味です。 –