2016-08-02 11 views
-2

Cで10進整数を構成する一連の文字を読み取る必要があるとしますが、fscanf()は使用できません。プログラムは以下のオクテットでテストされます。CのFILE *記述子で文字を安全にアンロックする方法

0x31 0x35 0x30 0x0a 

または単に:

150\n 

はどのようにあなただけの最初の3つのバイトが抽出されていることを確認していますか?つまり、fgetc()への今後の電話は、0x0aを返さなければなりません。これは、fscanf("%d")を使用し、次にfgetc()を使用した場合とまったく同じ動作になります。

+0

は、なぜあなたは彼らが実際にはないと仮定しますか? –

+2

C++では、バッファ内の次の文字で[peek](http://en.cppreference.com/w/cpp/io/basic_istream/peek)を実行できます。また、[最後に読み込んだ文字を取り除く](http://en.cppreference.com/w/cpp/io/basic_istream/unget)、[他の文字を戻す](http://en.cppreference。 co.jp/w/cpp/io/basic_istream/putback)。 –

+0

@πάνταῥεῖもし 'scanf("%d "、&x)'と 'c = getchar()'の入力が '150 \ n'なら' x'は150を、 'c'は' 0x0a'を保持します。 ..私のコンピュータでは、少なくとも。 – matheuscscp

答えて

0

まあ...答えが見つかりました。 fgetc()は、'\n'バイトを取得したときにEOFには入らないので、ungetc('\n')に電話をかけることは完全に安全です。記述子(基になるデバイスとは関係ありません)は有効な状態のままで、その後のfgetc()の呼び出しは'\n'を返します。

1

に安全に 'unget' 文字には、文字のみを取得した後、一度使用

  1. を保証します。プッシュバックの1文字が保証されています。追加の通話は機能しません。

  2. 保証値は、unsigned charの範囲内です。 EOFをプッシュバックすると、ストリームは変更されません。

例:

unsigned sum = 0; 
int ch; 
while (isdigit(ch = fgetc(stdin))) { 
    sum += ch - '0'; 
} 
ungetc(ch, stdin); 
+0

EOFをungetcすることは何もしないという意味で "安全"であり、ストリームにeofの指示を残す。もちろん、 'fgetc'を呼び出すときにeof指示子を正しくチェックしていないOSでは、次の' fgetc'で必ず別のEOF指示子を取得する必要はありませんが、この場合ungetcを呼び出すことは役に立ちません。 – rici

関連する問題