このようなプログラムを作りたいのですが上手くいきません。
(入力と出力は必ずアロー演算子を使う。)
<実行例>
番号を入力: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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
Linuxで入力待ちなしkeyread関...
-
正負を反転させて出力するプロ...
-
VB.NETで16進数+16進数や16進...
-
EDITコントロールで入力できる...
-
cout関数を使っているのですが...
-
VisualStudio2019のコードアナ...
-
至急教えてください!プログラ...
-
C-Builderで数値(数字)以外を入...
-
通信対戦ゲームでの通信遅延に...
-
カウントアップ
-
scanfが2回使えない・・・?;
-
scanf()についてお伺いいたしま...
-
Userformの入力順序をタブオー...
-
fgetsを用いたループ処理後の入...
-
Linuxプログラミングで、キーボ...
-
getchar()について 教えてくだ...
-
"scanf"でエンターで改行させな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
java初心者です。入力されたの...
-
Excel VBAで、Application.Inpu...
-
ワードで文字を入力する時の変...
-
WindowsでEOF
-
batプログラム上で文字列を入力...
-
getchar()について 教えてくだ...
-
cout関数を使っているのですが...
-
コマンドプロンプトからのEOFの...
-
"scanf"でエンターで改行させな...
-
VisualStudio2019のコードアナ...
-
至急教えてください!プログラ...
-
C言語scanf_sで何故か2回入力に...
-
scanf が無視されます
-
EDITコントロールで入力できる...
おすすめ情報