質問: 以下のプログラム問題が何度挑戦してもできません。 どなたか知恵を拝借させていただきたいです。
回答: ~プログラム例~ #define _CRT_SECURE_NO_WARNINGS //Visual Studio 用 #include int main() { printf("4文字の英単語:"); for (int i = 0;i < 4; ++i) { char 文字; if (scanf("%c", &文字) == 1) printf("%c", 文字); else break; } printf(" が入力されました。\n"); } 《解説》 ... 文字と文字列 ... 課題要件として「"文字"を入力するscanf()を何度使用してもよい」とあり、「"文字"」と強調されています。 その意味するところは「文字列」ではなく、「文字」ということ。文字配列(あるいはポインタ)ではなく文字、char*, char[] ではなくて char、という風に捉えるのが適切であると考えます。 scanf で文字を受け取るには上に掲げた例のように "%c" を使います。 ... scanfとif文 ... そして、scanf は失敗する場合があり(入力源において EOF となった場合など)、その場合は値は得られていません。そのことを判断するために if 文を置いています。 scanf は入力できた項目の数を返してきます。上の例では "%c" として一つの項目だけを受け取ろうとしているものであり、したがって成功すると 1 が返って来ます。 ... for文 ... 「必ず四文字入力される前提」とありますので for 文で4回繰り返す処理としてみました。上述の if 文は異常事態に対処するためのもので、そのような事態では4回繰り返すことなく途中で break します。 ... 変数 ... for 文の括弧内に int i の宣言部分も含める形としましたが、これはコンパイラのバージョンが極端に古いものとなっているとエラーになってしまいます。 その場合は、 int i; printf("4文字の英単語:"); for (i = 0;i < 4; ++i) { こうすると上手く行きます。ここで int i; は printf よりも上に持って行くことが大切です。 文字を受け取るための変数の名前を「文字」としてみました。現代の多くのコンパイラでは、このように漢字で書かれた変数名をそのまま用いることが出来ます。 しかし、やはりコンパイラによってはエラーとなる可能性もあります。そのような場合は、 for (int i = 0;i < 4; ++i) { char ch; if (scanf("%c", &ch) == 1) printf("%c", ch); else break; } このように変数名を ch 等とすると良いです。(はじめからそうしておけば良いということも言えるかもしれませんが...) なお、コンパイラが幾ら古くても、char ch; の宣言の位置はこれで大丈夫です。char ch; を他の場所に移す必要はありません。