for文のことで

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まっさ

for文のことで

#1

投稿記事 by まっさ » 16年前

「名前を順番に入力し、最後に全員の名前を表示する」というプログラムを作ろうとしています。
プログラムコード↓
#include <stdio.h>

int main(void){
   
char name[10][128];    /* 名前を格納する配列 */
int num = 0;           /* メンバーの人数 */ 
int cnt = 0;           /* ループ用の変数 */
   
printf("メンバーの人数は何名ですか?\n");
scanf_s("%d", &num);
   
   
for(cnt = 0; cnt <= num-1; cnt++){
printf("%d番目のメンバーのお名前は?\n", cnt+1);
gets(name[cnt]);      
}
   
printf("\n\n");
   
for(cnt = 0; cnt <= num-1; cnt++){
printf("%d番:%s\n", cnt+1, name[cnt]);
}
   
return 0;
   
}
コンパイル時にはエラーは表示されませんでしたが、実際に動かしてみたところ、
1回目に名前を入力するところだけ飛ばされてしまいます。
こんな感じになります↓


C:\Program Files\Microsoft Visual Studio 9.0\VC>test2
メンバーの人数は何名ですか?
5
1番目のメンバーのお名前は?
2番目のメンバーのお名前は?
yamada
3番目のメンバーのお名前は?
yamamoto
4番目のメンバーのお名前は?
yamasita
5番目のメンバーのお名前は?
yamane


1番:
2番:yamada
3番:yamamoto
4番:yamasita
5番:yamane


コンパイルは「VC++ 2008EE」のコマンドプロンプトで行っており、
実行ファイルもコマンドプロンプトで動かしています。

C言語は大学(情報系ではない)の授業でかじった程度なので初心者です。
「実行ファイルを動かす」などの表現も正しいか分からず使っています。
注釈の入れ方もよく分かっていないので、分かりずらいと思います。
質問内容以外のこともご指導いただけたらありがたいです。

sizuma

Re:for文のことで

#2

投稿記事 by sizuma » 16年前

scanf関数はエンターキーを押すところまでのキーを読み取るので、最初のscanf関数で
5(エンター)  ←読み取るためにデータをためておくところ(バッファ)
という風にバッファに読み込まれます。
この中で、
scanf_s("%d", &num)
として、十進数でnumに受け取ると、バッファの中身は
(エンター)
だけが残っています。

次にgets関数を使うと、バッファにデータが残っているので、飛ばされてしまうんですね。
これが、%dで10進数を読み取る場合は大丈夫なんですけど

対処法は、僕は文字列も受け取る、ってしたかな?
バッファの中を空にする関数もあると思うんですが。
僕も勉強中なんでわからないです^^;

一応scanf_s関数はscanf関数と同じ仕様はだとは思うんですが、違ったらごめんなさい。


>実行ファイルを動かす
別にいいと思います
僕は実行するって言いますね。

>注釈
シンプルなプログラムだし、変数名も分かりやすいんでコメントなくても大丈夫なくらいだと思います
ループの変数は僕はi,j,kでしますね。

<pre>
ここにプログラム
</pre>
っていう風にしないと、インデントされないんで気をつけてくださいー

sizuma

Re:for文のことで

#3

投稿記事 by sizuma » 16年前

訂正
>僕は文字列も受け取るってことにしたかな?

今書いてみたら
scanf("%d%s",&num,temp)ってするとおかしくなりました
scanf("%d%c",&num,&temp)ってするか、

scanf("%d",&num);
getchar();

ですかね。僕が思いつく限り

lbfuvab

Re:for文のことで

#4

投稿記事 by lbfuvab » 16年前

1 rewindやfflushでバッファクリア(環境依存)
2 改行付きの文字列で受け取り変換
3 scanfの受け取り方を工夫(ググれば出てきます)

と言ったところですね。

まっさ

解決しました。

#5

投稿記事 by まっさ » 16年前

sizumaさん、回答ありがとうございます。
ご指摘通りに変数「temp」を用意して、実行するとうまくいきました。
エンターのことも注意する必要があったとは、思いませんでした。

次はプログラムコードのインデント、気を付けます。

lbfuvabさん、回答ありがとうございます。
今回はscanfを工夫してやってみました。
教えていただいた他の方法もやってみます。

閉鎖

“C言語何でも質問掲示板” へ戻る