C言語初心者です。助けてください。
途中までがんばったのですがどうしてもできません。問題はこの構造体の*name→name[25],*email→email[30]に変換させたいのですが、そのまま変換すると左辺値が必要や移植性のないポインタ変換などのエラーが出てしまいます。どうすればいいですか?教えてください。あと関数getlineと構造体は変えないでください。(指定した部分は除く)
このプログラムは名前、メールアドレス、年齢を保存していき-1を入力した時出力されるというものです。
よろしくお願いします。
入力例
10
hakata
abc@・・・
12
yokohama
dfg@・・・
-1
-1
-1
出力例
-1
-1
-1
12
yokohama
dfg@・・・
10
hakata
abc@・・・
#include <stdio.h>
#include<stdlib.h>
struct node {
char *name;
char *email;
int age;
struct node *next;
} heap[100], *hp = heap;
void getline(char *s,int n)
{
int c;
while(--n>0&&((c=getchar())!=EOF && c!='\n'))
*s++=c;
*s='\0';
}
char* dupstr(char* strg)
{
char* newstr;
newstr=(char*)malloc(sizeof(char)*strlen(strg));
strcpy(newstr,strg);
return newstr;
}
struct node *new(int n ,char* a, char* b)
{
hp->age=n;
hp->email=a;
hp->name=b;
hp->next=NULL;
return hp++;
}
struct node *add(struct node *p, struct node *q)
{
q->next=p;
p=q;
return p ;
}
void print_list(struct node *p)
{
while (p != NULL) {
printf("%d ", p->age);
printf("%s ", p->name);
printf("%s ", p->email);
p=p->next;
}
printf("\n");
}
main()
{
int age,p;
char buf[80],a[80],b[80],*email,*name;
struct node *root=NULL;
while(getline!=NULL)
{
getline(buf,sizeof(buf));
age=atoi(buf);
getline(b,sizeof(b));
getline(a,sizeof(a));
email=dupstr(b);
name=dupstr(a);
root=add(root,new(age,email,name));
if(age==-1)
break;
}
print_list(root);
}
No.2ベストアンサー
- 回答日時:
以下に変更してみてください。
<変更点>
・new は予約語なので、_new とする
・現ポジション認識のため、Noを追加
・文字列を=でやっていましたがこれではアドレスをコピー
していて、元文字列がローカルスコープ内で消滅するため
バッファ・トゥ・バッファで複製します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct node {
int no;
char name[80];
char email[80];
int age;
struct node *next;
} heap[100],*hp=heap;
void getline(char *s,int n)
{
int c;
while(--n>0&&((c=getchar())!=EOF && c!='\n'))
*s++=c;
*s='\0';
}
struct node* _new(int n ,char* a, char* b)
{
hp->age=n;
strcpy(hp->name,a);
strcpy(hp->email,b);
return hp->no<100?++hp:hp;
}
void print_list(struct node *p)
{
do {
printf("%d ", p->age);
printf("%s ", p->name);
printf("%s \n", p->email);
}while ((p--)->no);
printf("\n");
}
int main()
{
int age,i;
char buf[80],a[80],b[80],*email,*name;
struct node *root=hp;
for (i=0;i<100;i++) (root++)->no=i;
root=hp;
root->no=0;
while(root->no<100)
{
getline(buf,sizeof(buf));
age=atoi(buf);
getline(a,sizeof(a));
getline(b,sizeof(b));
name=a;
email=b;
root=_new(age,name,email);
if(age==-1)
break;
}
print_list(--root);
return 0;
}
No.1
- 回答日時:
main 関数から読み始めてみましたが,今のままだとできないと思います.
まず,以下の部分で疑問が生じます.
while(getline() != NULL)
getline には戻り値がないので,NULL かどうかを判別できないハズです.
(getline は関数なので,まずは "getline()" としなければです☆)
「getline 関数は変更しないで」というのが前提ですし,再度 while 文の条件式を考え直すところから初めてみてはいかがでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
バイトスワップをやりたい
-
c言語でユーザ関数を利用して入...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
Linuxでフォルダ内全ファイル名...
-
enumの記述について。
-
配列をnビットシフトする
-
ユニコード文字列の分割
-
DPマッチング
-
C言語です
-
RGB→YUV変換のプログラム
-
C言語のビットフィールドについて
-
c++ 文字列を入力して、一文字...
-
C言語のポインターで詰まっている
-
ワイルドカードを用いた文字列検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報