- ベストアンサー
このプログラムのポインタを配列に変換したいんですけど
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); }
- みんなの回答 (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; }
その他の回答 (1)
- WizTaka
- ベストアンサー率53% (7/13)
main 関数から読み始めてみましたが,今のままだとできないと思います. まず,以下の部分で疑問が生じます. while(getline() != NULL) getline には戻り値がないので,NULL かどうかを判別できないハズです. (getline は関数なので,まずは "getline()" としなければです☆) 「getline 関数は変更しないで」というのが前提ですし,再度 while 文の条件式を考え直すところから初めてみてはいかがでしょうか?
お礼
ありがとうございます。 もう一度考えてみます。
お礼
ありがとうございます。 この方法でやったらできました。 お手間をとらせてすみません。 本当にありがとうございます。