1 つの問題は、次の組み合わせです。
char question, n, y;
scanf("%s", &question);
%s
null で終わる文字列を 1 文字に読み取るために使用しています。'y' を押して戻っても、変数の末尾を超えて上書きされます。これは良くない。(良いニュースは"%s"
、数字の後の改行を含む空白をスキップすることです)。
"%c"
次の形式で使用する必要があります。
char question;
scanf(" %c", &question); // NB: The leading space is important!
または、文字列形式と文字列変数を使用する必要があります (および no &
):
char question[10];
scanf("%9s", question);
配列を使用する場合は、 を使用するstrcmp()
か、入力の最初の文字を比較するかを検討する必要があります。
while (strcmp(question, "n") == 0);
while (question[0] == 'n');
n
おそらく、変数を宣言していないので、変数を追加したとコンパイラから言われたでしょう。おそらく、ループをwhile (question == 'n'
);で終了する必要があります。and then get rid of the (now) unused variable
n (and the currently unused variable
y`)。
使用する場合は、" %c"
フォーマット文字列でスペースを省略してください:
scanf("%c", &questions);
その後、通常は番号の後に改行を取得しますが、これは ではありません'n'
。そのため、何かを入力するのを待たずに、ループが毎回終了します。scanf(" %c", &question);
文字を読み取る前に、空白をスキップすることを巧みに行うことができます。
scanf()
使用するたびに、期待した入力を受け取ったをテストする必要があります。単一項目入力の正しいテストは次のとおりです。
if (scanf(" %c", &question) != 1)
...input failed...
EOF と変換の失敗を区別する必要がある場合は、次の戻り値をキャプチャできますscanf()
。
int rc;
if ((rc = scanf(" %c", &question)) != 1)
...rc == EOF on EOF; rc == 0 on 'conversion failure'...
...a single character input can't easily fail...
...but if someone types 'a' instead of '9' when you're looking for a number...
を使用して I/O を正しく行うことscanf()
は、非常に困難です。多くの経験豊富なプログラマーは、単純にそれを使用しません。正しくするのは難しすぎます。代わりに、fgets()
または POSIXを使用getline()
してデータ行を読み取り、 を使用sscanf()
してそれを解析します。これには多くの利点がありますが、主なものは、改行が食べられているため、question
期待する答えが変数に含まれていないという問題に遭遇しないことです。