【C言語】scanf()の怪【色々分かった】 | りょうとのITブログ

りょうとのITブログ

Windows 10 Pro 64bit 始めました。

フレのYoutubeが更新されてました。この場を借りて宣伝。

← 以前のエントリはこちら

色々勉強して、以前scanf()でどん詰まった箇所が分かりました。 まず、最初のプログラム、
#include int main(void){ char c; scanf("%c", &c); printf("%c\n", c); scanf("%c", &c); printf("%c\n", c); return 0; }
で、'A', '\n', 'B' と入力すると

$ ./test A A $

と表示されるのは何でか、という点。 これは、↑の入力列から明らかなように、'A'と'\n'しか読み込まれていない、というのが答えです。1行目の'A'は入力、2行目の'A'はそのエコー、3行目の'\n'はprintf()による改行、4行目の'\n'は入力列の2つ目'\n'のエコー、そして最後の'\n'は同じくprintf()内の改行によるもの、という仕組みでした。 では当初の目的、'A', '\n', 'B' という入力列で、'A', '\n', 'B' という出力を得るにはどうすれば良いか。単純です。2回のscanf()を3回にすれば良いだけです。 以下、ソース:
#include int main(void){ char c; scanf("%c", &c); printf("%c", c); scanf("%c", &c); printf("%c", c); scanf("%c", &c); printf("%c", c); printf("\n"); return 0; }
結果:

$ ./test A A B B $

但し、これはあまりスマートなやり方ではありません。n回入力があるなら、n回scanf() とprintf() を記述しなければいけないからです。 そこで、もちっと改良。の前に仕様を決めます。 1. 文字が入力されたら、その文字と改行を出力する。 2. 2文字以上入力されたら、都度その文字と改行を出力する。 3. '0'が入力されたら終了する。 以下、ソース:
#include /* 80文字以上は入力しない事!それとマルチバイト文字には対応してません */ int main(void){ char str[80]; int i; int loop; for(loop = 1; loop; ){ printf("> "); scanf("%s", &str[0]); for(i = 0; str[i] != '\0'; i++){ printf("%c\n", str[i]); } if(str[0] == '0') loop = 0; } return 0; }
結果:

$ ./scanTest2 > A A > AB A B > aAb a A b > 0 0 $

以上!