

このようなプログラムを作りたいのですが上手くいきません。
(入力と出力は必ずアロー演算子を使う。)
<実行例>
番号を入力:1
名前を入力:taro
番号:1
名前:taro
どなたかよろしくお願い致します
#include <stdio.h>
#include <string.h>
typedef struct{
int no;
char name[21];
}student;
void in(student *std){
char namae[21];
int bango,i=0;
scanf("%d", &bango);
std->no = bango;
while(1){
namae[i] = getchar();
if((i >= 20 ) || (namae[i] == '\n'))
break;
i++;
}
i++; namae[i] ='\0';
strcpy(std->name,namae);
}
void out(student *std){
printf("%d\n", std->no);
printf("%s\n", std->name);
}
main(){
student person;
in(&person);
out(&person);
return 0;
}
No.2ベストアンサー
- 回答日時:
★ほぼ出来ていますが…。
・『in』関数の『while』の次にある『i++』は不要です。
・『while』ブロックの中で『i++』を行っているため必要ありません。
・場所分かりますか?→『in』関数の下から3行目の『i++』です。
・また、『namae[i] = getchar();』の行は、『namae[i] = (char)getchar();』と
(char)キャストします。
・『while(1){}』は『for(;;){}』とすると警告メッセージが出ません。
・そして、一番重要なのが『scanf』関数の後(std->noの次など)に『fflush』の
関数で標準入力をフラッシュさせます。
・こうしないとバッファに数字の『1』が溜まったままになってしまいます。
●修正(in関数のみ→他はあっています)
void in( student *std )
{
char namae[ 21 ];
int bango, i;
scanf( "%d", &bango );
std->no = bango;
fflush( stdin ); ←ここがポイント
for ( i = 0 ; ; i++ ){ ←この方が分かりやすいよ(初期化 ; 条件式 ; 増減式)
namae[ i ] = (char)getchar();
if( (i >= 20) || (namae[i] == '\n') ){
break;
}
}
←ここにあった『i++』は不要です。
namae[ i ] ='\0';
strcpy( std->name, namae );
}
最後に:
・『for』文の2つ目の条件式を省略すると無限ループを構成します。
・『while(1)』でもループできますが、警告メッセージなどが出ます。
・よって、無限ループのときは『for(;;){}』という風にすれば良い。→3つ省略可能なのです。
・以上。おわり。
参考URL:http://www.bohyoh.com/CandCPP/C/Library/fflush.h …
丁寧に指摘していただきありがとうございます。
無限ループしたい時はだいたいwhile(1)を使っていました(汗
確かにfor文を使ったほうがスッキリした感じがしていいですよね。
とても参考になりましたありがとうございます!!
No.3
- 回答日時:
scanf で数字だけ読み取っても、バッファに改行が残っているので
(これは#1の型のおっしゃるとおり)それを何らかの形で読み飛ばさないと
getchar()で最初にその残った改行を読むことになってしまいます。
改行まで空読みするなどするか、行の読み取りとそこから
数値としての取り出しを二段構え(たとえば fgets + sscanf)で
やるなどしたほうが良いと思います。
ところで入力に残った「ごみ」を片付けなければならないのはいいとして、
仮にも「専門家」を名乗る人が fflush(stdin) を最重要とか
云ってしまうのはいかがなものかと。
処理系によっては期待通りの動作をするかもしれませんが、
int fflush(FILE *ostream);
ostream points to an output stream or an update stream in which the
most recent operation was not input, the fflush function causes any
unwritten data for that stream to be delivered to the host environment to
be written to the file; otherwise, the behavior is undefined.
この通り「未定義」動作です。
No.1
- 回答日時:
最初のscanfをしたところで入力された改行コードがバッファに残ってしまい、それが次のgetcharのループで読み出されることですぐにループが終わってしまっているようです。
解決方法としては、scanfを行った後に、バッファの内容をクリアすれば良いと思います。
具体的には
fflush(stdin);
を追加します。
また、文字列の読み込みをgetcharをループさせることで行っていますが、fgets関数を用いることでこの場合と同様にscanfのように領域をオーバーしないで文字列の読み込みができます。
調べてみて、使ってみると良いと思います~。
参考URL:http://kitaj.at.infoseek.co.jp/fgets.html
ご回答ありがとうございます!!
scanfを使うと改行コードがバッファに残るということをはじめて知りました。fgetsでも試してみたいとおもいます。
とても助かりました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
"scanf"でエンターで改行させな...
-
C++の課題が分かりません。
-
scanfが2回使えない・・・?;
-
Eclipseコンソール表示を、リセ...
-
正負を反転させて出力するプロ...
-
コマンドプロンプトからのEOFの...
-
通信対戦ゲームでの通信遅延に...
-
数字以外が入力されたらエラー...
-
scanf()の順番
-
電卓の小数点
-
最大公約数と最小公倍数を求め...
-
エクセルVBAのコードについて
-
至急教えてください!プログラ...
-
"gets"は危険なのでしょうか?
-
Yesならこっちへ、NOなら...
-
標準ライブラリ関数と標準入力...
-
Excel VBAで、Application.Inpu...
-
入力する数字のサイズ制限について
-
scanf関数の戻り値について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報