
C言語で以下のようなプログラムを作りました。
「main関数内で下記のデ-タを構造体に格納し、キーボードから入力された名前と該当する学生の身長と年齢を画面に表示するプログラムを作成せよ。」というものです。
このプログラムはコンパイルは通るのですが、2人目以降のデータを表示させようとしても表示してくれません。。。どうもリスト構造のfor文がうまくループしていないみたいなんですが原因が分かりません。どなたか原因の分かる方アドバイスをお願いしますm(_ _)m
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct data{
char name[20];
int height;
int age;
struct data *next;
}person;
person *newperson(void);
int main(void){
char namae[20],s[20];
int toshi,shinchou,i;
person *head;
person *list;
person *nlist;
person *LIST;
head = newperson();
nlist = head;
printf("データを入れてください。\n");
for(i=0;i<=4;i++){
scanf("%s",namae);
scanf("%d",&shinchou);
scanf("%d",&toshi);
list = newperson();
strcpy(list ->name,namae);
list -> height = shinchou;
list -> age = toshi;
nlist -> next = list;
nlist = list;
}
printf("知りたい人の名前は?\n");
scanf("%s",s);
for(LIST = head->next;LIST ->next != NULL;LIST = LIST->next){
if(strcoll(s,LIST ->name)==0){
printf("%s\t%d\t%d\n",LIST->name,LIST->height,LIST->age);
break;
}
printf("%s\n",LIST->name);
printf("%s\n",LIST->next->name);
}
return(0);
}
person *newperson(){
person *dummy;
dummy = (person*)malloc(sizeof(person));
dummy -> next = NULL;
return(dummy);
}
No.1ベストアンサー
- 回答日時:
>2人目以降のデータを表示させようとしても表示してくれません
ということですが、とりあえずMacOS X + GCCで動かしたところ、二人目以降も表示してますね。
ただ、最後の人は絶対にヒットしないので修正する必要があります。ヒントは検索ループの継続条件。
あと、問題がもう一つ。
newperson()でmallocしているけど、プログラム中のどこにもfreeする箇所がない。
とりあえずはそれでも動作しますが、確保したメモリーはきちんと解放するようにしましょうね。
ヒントありがとうございます!!
おかげで「LIST != NULL;」ってことに気づけました。あとfreeの注意にも感謝します!!
No.3
- 回答日時:
バグがありました。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _person
{
char *name;
int height;
int age;
struct _person *next;
} person;
char *
getline(void)
{
static char buf[BUFSIZ];
if (fgets(buf, BUFSIZ, stdin) == NULL) {
exit(0);
}
buf[strlen(buf) - 1] = 0;
return (buf);
}
int
main(void)
{
int find;
char *s, *name;
person *head = NULL;
person *list;
person **nlist;
nlist = &head;
while (1) {
printf("知りたい人の名前は?\n");
name = getline();
find = 0;
for (list = head; list != NULL; list = list->next) {
if (strcoll(name, list->name) == 0) {
printf("%s\t%d\t%d\n", list->name,
list->height, list->age);
find++;
break;
}
}
if (find == 0) {
name = strdup(name);
printf("見つかりません\n");
printf("データを入れますか? (y/n) ");
s = getline();
if (s[0] != 'n') {
list = (person *) malloc(sizeof(person));
list->next = NULL;
list->name = name;
printf("身長:");
list->height = atoi(getline());
printf("年齢:");
list->age = atoi(getline());
*nlist = list;
nlist = &list->next;
}
else {
free(name);
}
}
}
return (0);
}
No.2
- 回答日時:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct data
{
char *name;
int height;
int age;
struct data *next;
} person;
person *
newperson()
{
person *dummy;
dummy = (person *) malloc(sizeof(person));
dummy->next = NULL;
return (dummy);
}
char *
getline(void)
{
static char buf[BUFSIZ];
if (fgets(buf, BUFSIZ, stdin) == NULL) {
exit(0);
}
buf[strlen(buf) - 1] = 0;
return (buf);
}
int
main(void)
{
int find;
char *s, *name;
person *head = NULL;
person *list;
person **nlist;
person *LIST;
nlist = &head;
while (1) {
printf("知りたい人の名前は?\n");
name = getline();
find = 0;
for (LIST = head; head != NULL && LIST != NULL;
LIST = LIST->next) {
if (strcoll(name, LIST->name) == 0) {
printf("%s\t%d\t%d\n", LIST->name,
LIST->height, LIST->age);
find++;
break;
}
}
if (find == 0) {
name = strdup(name);
printf("見つかりません\n");
printf("データを入れますか? (y/n) ");
s = getline();
if (s[0] != 'n') {
list = newperson();
list->name = name;
printf("身長:");
list->height = atoi(getline());
printf("年齢:");
list->age = atoi(getline());
*nlist = list;
nlist = &list->next;
}
else {
free(name);
}
}
}
return (0);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
strtok
-
csvファイルの読み取り
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
配列から構造体へデータコピー
-
fatal error LNK1120: 外部参照...
-
C言語
-
空白を含んだ文字列がうまく格...
-
WinInetのInternetOpenUrl関数...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
C言語で複数列のデータを1列の...
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
10個出力で改行したいのですが...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
Aの値からBの値を除するとは??
-
ラグランジュの補間法のCプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報