0
0
調査したこと・試したこと
fgets, scanf, getcharの三つの入力として使われる関数をもとに、決められた文字数だけをデータとして持ち、それ以上の入力は読み飛ばして、バッファの中身を空にするということを行ってきました。
じゃあなぜgetcharを投稿したのかというと、今後入力した文字列に条件(半角のみとか)をつける際に、一文字ずつ受け取って、判定して、次の文字を受け取って、判定して、、、、を繰り返した方が、正確に情報を読み取り、バグが少ないと考えたからです。
ただ自分で解答した通り、scanfで文字数を指定して、入力できることを知り、受け取った後にバッファを読み飛ばせばいいことに気づきました。
scanfの方法ではfgetsができないことがわかっています。fgetsは\nも読み取ってしまうので、while(getchar()!=''\n);の記述をしてしまうと、while文での入力待ちが発生してしまいます。scanfは\nを読み取らないので、質問解答に記載した方法が最良なのではないかと考えます。
皆様の意見をお聞かせ下さい。
テーマ、知りたいこと
記事に載せましたコードのレビューをお願いしたいです。
また改善策などありましたら、コメントのほどお願いします。
ソースコード説明
ソースコードの内容としまして、
入力文字列を上限10文字で受け取るというものです。
入力はgetcharで行います。
10文字以下の入力の場合は、そのままプリントされます。
10文字以上の入力の場合は、10番目以降の文字を読み捨てられる。
なぜソースコードにscanfがあるのか
ご指摘いただいた内容です。
バッファに残っていないことを確認するために、scanfを置いておき、
・何もせずに入力を受け取っていたら、バッファに文字が残っており、
・入力待ち状態になったら、バッファに文字が残っていないことがわかるようになっています。
ソースコード
C
1#include <stdio.h> 2 3int main(){ 4 char name[10]; 5 int c; 6 int i; 7 int flag = 0; 8 9 for(i = 0; i < 10; i++){ 10 c = getchar(); 11 12 if(c == '\n'){ 13 name[i] = '\0'; 14 break; 15 } 16 17 name[i] = c; 18 19 if(i == 9 && c != '\n'){ 20 name[i + 1] = '\0'; 21 flag = 1; 22 break; 23 } 24 } 25 26 if(flag == 1){ 27 name[i] == '\0'; 28 while(getchar() != '\n'); 29 } 30 31 int num; 32 scanf("%d", &num); 33 34 printf("%s", name); 35 36 return 0; 37}
回答6件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。