C言語コードレビュー:バッファに残った文字を読み飛ばす。

調査したこと・試したこと

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}

コメントを投稿

0 コメント