§4/ 2(WG14 N1570引用):
未定義の挙動は、他の単語「」未定義の動作「」によって、または動作のいずれか 明示的な定義を省略することにより、この国際 規格で示されています。
§7.21.3/ 11
バイト入力関数はfgetc
関数へ 連続呼び出しであるかのように、ストリームから文字を読み取ります。
(およびfscanf
は、バイト入力関数です.7.2.1/5)。
§7.21.7.1:
fgetc
機能
概要
#include <stdio.h>
int fgetc(FILE *stream);
説明
入力ストリームのエンドオブファイルインジケータはstream
によって を指摘している場合に設定し、次の文字が存在していない、fgetc
関数はint
に変換unsigned char
としてその文字を取得し、関連進み ストリーム(定義されている場合)のファイル位置インジケータ。
戻り
ストリームのend-of-fileインジケータが設定されている場合、またはストリームがファイルの終わりにある 場合、用ファイル終了インジケータストリーム が設定され、fgetc
関数がEOF
を返します。そうでない場合、fgetc
関数は、入力ストリームの次の文字を に指してstream
で返します。読み取りエラーが発生すると、 ストリームのエラーインジケータが設定され、fgetc関数はEOF
を返します。 [脚注省略]
fgetc
の指定では、「stream
が指し示す入力ストリーム」と繰り返し指定されています。 stream
が入力ストリームを指し示すという暗黙的な要求があるか、またはstream
が入力ストリームを指していないときに標準を省略して動作を指定するという2つの方法で読み取ることができます。
最初のケースでは、非入力ストリームをfgetc
に渡すと、その要件に違反し、未定義の動作になります(§7.1.4/ 1も参照してください。これは、関数のドメイン外の値"); 2番目のケースでは、非入力ストリームをfgetc
に渡すと、その場合の標準ではfgetc
の動作については何も言及していないため、省略によって未定義の動作になります。だから私はfgetc(not_an_input_stream)
は未定義の動作を引き起こすと主張するだろう。
fgetc(not_an_input_stream)
が未定義の振る舞いの場合は、fscanf(not_an_input_stream, /*...*/)
です。後者は、前者を呼び出すことによって文字を読み取るように指定されています。
コードはCではなく、Cです。 –
ダウンリストの場合:コードをCに書き直してください。気にしません。 * Cの標準に関する問題、またはC++の標準とCのライブラリが組み込まれているという事実は変わりません。 – sigh
** stdout **は入力ストリームではなく出力ストリームなので、入力ストリームを入力することはできません。未定義の動作です。 **あなたのアプリケーションに**標準出力**を行い、** stdin **からそれを読んでください。 – LPs