以下の通りの入力が与えられたとします。
数字1文字(以降Nと呼びます)
aiueo
※数字1文字(N)に関しては、必ず1~5までの範囲が入力されるとします。
ここで、
4
aiueo
上記のような入力がされた場合、期待される出力は以下の通りです。
aiue
さて、そのプログラムを実装するために以下のようなコードを書いてみました。
C
1#include<stdio.h> 2int main(void){ 3 int N,i,dummy; 4 char S[5]; 5//aiueoをS[0]~S[N-1]に入力させる処理 6 scanf("%d",&N); 7//scanf("%c",&dummy); //改行コード読み飛ばし用 8 for(i=0;i<N;i++){ 9 scanf("%c",&S[i]); 10 } 11//S[0]~S[4]を表示する処理。 12 for(i=0;i<N;i++){ 13 printf("%c",S[i]); 14 } 15}
上記コードの実行結果ですが、出力は以下のようになりました。
aiu
おそらく、S[0]に改行コードが意図せず入力されてしまったことが原因だと考えています。
そこで、改行コードがS[0]に入力されるのを回避するために以下の書き方に変えてみました。
C
1#include<stdio.h> 2int main(void){ 3 int N,i,dummy; 4 char S[5]; 5//aiueoをS[0]~S[N-1]に入力させる処理 6 scanf("%d",&N); 7 scanf("%c",&dummy); //改行コード読み飛ばし用 8 for(i=0;i<N;i++){ 9 scanf("%c",&S[i]); 10 } 11//S[0]~S[N-1]を表示する処理。 12 for(i=0;i<N;i++){ 13 printf("%c",S[i]); 14 } 15}
このように、改行コード読み飛ばし処理を追記することで、期待通り、
aiue
と出力されました。
この過程で色々と試してみたのですが、改行コード読み飛ばし処理を記述しなくても以下のような書き方でも期待通りの出力がされることが確認できました。
C
1#include<stdio.h> 2int main(void){ 3 int N,i,dummy; 4 char S[5]; 5//aiueoをS[0]~S[N-1]に入力させる処理 6 scanf("%d\n",&N); //'\n'を追記してみました 7 for(i=0;i<N;i++){ 8 scanf("%c",&S[i]); 9 } 10//S[0]~S[N-1]を表示する処理。 11 for(i=0;i<N;i++){ 12 printf("%c",S[i]); 13 } 14}
これは一体どういうことなのでしょうか?
scanf(%d\n,ほげほげ)といった書き方でも改行コードをスキップして入力取得することが出来るということなのでしょうか?
また、余談なのですが(記憶が曖昧で以下の表記が正しいかはわかりませんが)
scanf("%[0-z],%hoge);
といったようなscanfの書き方があったかと思います。
これについて復習をしたいのですが、なんとか演算子、といった名前だったような気がするのですが思い出せません。
お心当たりがあれば、この書き方の名称を教えていただけますと幸いです。
以上、よろしくお願いします。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/14 17:18