Cを勉強中です。
年齢に-1が入力されるまで、名前、年齢、性別を聞くプログラムを作っているのですが、どうしてもうまく動きません。
具体的には、年齢を聞かれず、年齢?性別?_とまとめて表示されてしまいます。
ぜひともどこが間違っているか教えてください。お願いしますm(_ _)m
#include<stdio.h>
typedef struct{
char name[20];
int year;
char sex[6];
}student;
void read_data(int,student*);
void write_data(int,student*);
int main(void){
student data[10];
int i=0,j=0;
do{
read_data(i,data);
i++;
}while(data[i-1].year!=-1);
for(j=0;j<=i-1;j++){
write_data(j,data);
}
return 0;
}
void read_data(int i,student *data){
printf("%d人目\n",i);
printf("名前?\n",i);
scanf("%s\n",&(data[i].name));
printf("年齢?\n",i);
scanf("%d\n",&(data[i].year));
printf("性別?\n",i);
scanf("%s\n",&(data[i].sex));
return;
}
void write_data(int j,student *data){
printf("%d人目\t",j+1);
printf("名前:%s",data[j].name);
printf("年:%d",data[j].year);
printf("性:%s",data[j].sex);
return;
}
No.2ベストアンサー
- 回答日時:
実行した際に
名前?
aaa(改行)
bbb(改行)
年齢?
性別?
ccc(改行)
のように名前の時に二回エンターキーを押していませんか?これは
scanf("%s\n",&(data[i].name));
の\nが存在するため、aaaの改行をフォーマットの一致と判断されただけで、scanfの終了と判断されないためです。
そのためbbb(改行)というふうに他の文字を入れることで、\nの一致を終了させるのですが、このbbbが実はバッファ上に残っているのです。
そのため、年齢?の際にバッファ上に残っているbbbを参照し、不一致と判断され、即終了していたわけです。
さらに、不一致で終了しているのでまだbbbはバッファ上に残っています。
従って、性別のところでccc(改行)としていますが、これは名前の時と同じことが起きていて、
scanfはbbb(改行)ccc(改行)を処理しているためdata.sexにはbbbが代入されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
int型(2バイト)データの分割
-
エクセルVBA:日付データの変換...
-
c言語 Bitについて
-
linuxのシェルでファイル名に先...
-
printfの%eで指数部分の桁数を...
-
C#でのswitch文
-
テキストファイルの結合について
-
POSTで配列のデータを渡す方法は?
-
PINVOKEで構造体配列をマーシャ...
-
C言語 ファイル内のデータと入...
-
【Excel VBA】10進数を2進数に...
-
パイソン、データーサイエンス...
-
H8/36064を使ったシリアル通信...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
stable diffusionのエラー
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
パイソン、データーサイエンス...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
int型(2バイト)データの分割
-
CreateProcessでの環境変数の設...
-
【Excel VBA】10進数を2進数に...
-
python 気象データの取得
-
テキストファイルの結合について
-
RegQueryValueExでの2バイト文字
-
linuxのシェルでファイル名に先...
-
'dataType' 引数を Null にする...
-
C言語についてです! 同じ年の...
-
オセロゲーム 2次元配列で困...
-
PINVOKEで構造体配列をマーシャ...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
System.Collections.ArrayList ...
おすすめ情報