コードのどこで実行結果の「ファイルから読んだ文字列:hosi,nagoya,5436,mail-7」
を表示しているんですか。
それと何度も教えてもらっているのですが、関数void list_add()の下のほうの
p->next = *head;
if (p->next != 0)
p->next->before = p;
p->before = 0;
*head = p;
を詳しく教えていただきませんか。分からないのは引数がstruct address **headになっているためだと思います。
*headでポインタを表わしているのは分かるのですが、struct address **headの中には
char *nameが含まれているので、struct address **headがポインタのポインタになっていると思うんですが。そのあたりも含めて、上のコードを説明していただけませんか。
コード #define N 256 #define FILENAME "address.csv" struct address{ char name[N]; char address[N]; char tel[N]; // 電話番号 char mail[N]; struct address *next; struct address *before; }; void chop(char *p) { for (; *p; p++) ; p--; // *pが\0となりfor()を抜けるとここに来る。 //ポインタを1個戻して,\0 の前が'\r'か'\n'どうか調べるため。 while (*p == '\r' || *p == '\n') *(p--) = 0; }//chop()を抜けると\0で区切られた文字列になる。 void list_add(struct address **head, char *name, char *address, char *tel, char *mail) { struct address *p; if ((p = malloc(sizeof(struct address))) != 0) { strcpy(p->name, name); strcpy(p->address, address); strcpy(p->tel, tel); strcpy(p->mail, mail); p->next = *head; //**headでもらっているので*headは構造体の(head)アドレスである if (p->next != 0) p->next->before = p; //(p->next)->before = p //(p->next)の中のbeforeはpを指している p->before = 0; //こんがらがっています *head = p; //新しく構造体の(head)アドレスをpにする //こんがらがっています } } int main() { struct address *head; FILE* fp; static char buff[N], name[N], address[N], tel[N], mail[N]; char *token=","; head = 0; if ((fp = fopen(FILENAME,"r")) != 0) { while(fgets(buff, N, fp) != 0){ //本当の大元の文字列を書き換えないようにするために //bufを確保してコピーし、それをstrtok()の引数にしている。 char *p; chop(buff); printf( "ファイルから読んだ文字列:%s\n", buff ); p = strtok(buff, token); if ( p != NULL ) { strcpy(name, p); } else { printf( "氏名の切り出しに失敗しました。\n"); break; } p = strtok(NULL, token); if ( p != NULL ) { strcpy(address, p); } else { printf( "住所の切り出しに失敗しました。\n"); break; } p = strtok(NULL, token); if ( p != NULL ) { strcpy(tel, p); } else { printf( "電話番号の切り出しに失敗しました。\n"); break; } p = strtok(NULL, token); if ( p != NULL ) { strcpy(mail, p); } else { printf( "メールアドレスの切り出しに失敗しました。\n"); break; } list_add(&head, name, address, tel, mail); } } fclose(fp); return 0; } 実行結果 naka@naka ~ $ cd kadai/kadai9-8 naka@naka ~/kadai/kadai9-8 $ gcc -o kad9-8a kad9-8a.c -Wall naka@naka ~/kadai/kadai9-8 $ kad9-8a ファイルから読んだ文字列:hosi,nagoya,5436,mail-7 ファイルから読んだ文字列:kato,kanagawa,080-8888,mail1-2 ファイルから読んだ文字列:koko,yosida,090-2314,mail-6 ファイルから読んだ文字列:naka,kamikosaka,080-4444,mail1-1 ファイルから読んだ文字列:nasi,nogata,090-6376,mail-8 ファイルから読んだ文字列:saito,yamanashi,080-6666,mail1-3 ファイルから読んだ文字列:sato,tokyo ,090-3333,mail1-4 ファイルから読んだ文字列:suzuki,saitama,090-2222,mail1-5 nakamura@nakamura ~/kadai/kadai9-8 $
回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/23 08:44
退会済みユーザー
2018/01/23 09:00
2018/01/23 09:03
退会済みユーザー
2018/01/23 09:05
2018/01/23 09:07
退会済みユーザー
2018/01/23 09:11
退会済みユーザー
2018/01/23 09:15
2018/01/23 09:16
退会済みユーザー
2018/01/23 09:17
2018/01/23 09:37 編集
退会済みユーザー
2018/01/23 09:41
2018/01/23 09:49 編集
退会済みユーザー
2018/01/23 10:06