アプリ版:「スタンプのみでお礼する」機能のリリースについて

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);


}

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
この方法でやったらできました。
お手間をとらせてすみません。
本当にありがとうございます。

お礼日時:2008/01/15 02:02

main 関数から読み始めてみましたが,今のままだとできないと思います.


まず,以下の部分で疑問が生じます.

while(getline() != NULL)

getline には戻り値がないので,NULL かどうかを判別できないハズです.
(getline は関数なので,まずは "getline()" としなければです☆)

「getline 関数は変更しないで」というのが前提ですし,再度 while 文の条件式を考え直すところから初めてみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
もう一度考えてみます。

お礼日時:2008/01/14 23:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!