下記のコードで実行すると連結リストにその都度格納されるのですが、whileを抜け出すと一番最後の住所しか格納されていない状態になってしまいます。p = gFront.next; や p = (*p).nextを使おうとしたのですが、使用した場合プログラムが動かなくなってしまいます(コンパイルエラーは起きてないです)。
struct address gFrontのダミーセルの設定はこれであっていますか?
1番下にあるファイルがaddress1.txtで住所の入っているものになります。はじめの4はそのファイルに入っている住所の数です。
よろしくお願いいたします。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "lib2.h"
typedef struct address{
char zip[8];
char addr[150];
char yomi1[64];
char yomi2[64];
char yomi3[64];
struct address *next;
}add;
struct address gFront = {"","","","","",NULL};
int main(int argc, char *argv[]){
add *p;
char str[512];
char *adr1,*num;
int i = 0;
if(argc != 2){ /*引数があっているか確認*/
fprintf(stderr,"プログラム引数を1つ指定してください\n");
exit(1);
}
lib2_open(argv[1]); /*ファイルを開く*/
p = (add*)malloc(sizeof(add));
lib2_scanf("%s",num);
printf("%s\n",num);
while(i < atoi(num)){
lib2_scanf("%s %s %s %s %s",(*p).zip,(*p).addr,(*p).yomi1,(*p).yomi2,(*p).yomi3);
printf("%s %s %s %s %s\n",(*p).zip,(*p).addr,(*p).yomi1,(*p).yomi2,(*p).yomi3);
i++;
}
i = 0;
printf("検索する文字列\n");
scanf("%s",str);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
extern int vfscanf(FILE *stream, const char *format, va_list ap);
static FILE *InputFileFp = NULL;
/* 引数に与えたファイル名のファイルを入力用として内部に開いておく. */
void lib2_open(char *filename){
static int opennum = 0;
if (InputFileFp != NULL){
fprintf(stderr, "エラー: lib2_open: 既にファイルを開いています.\n");
fprintf(stderr, " 2重に開くことはできません.\n");
exit(1);
}
if (opennum > 0){
fprintf(stderr, "エラー: lib2_open: ファイルを開けるのは1回だけです.\n");
exit(1);
}
InputFileFp = fopen(filename, "r");
if (InputFileFp == NULL){
fprintf(stderr, "エラー: lib2_open: '%s'を開けませんでした.\n", filename);
fprintf(stderr, " ファイルが無いかスペルミスしていませんか?\n");
exit(1);
}
opennum++;
}
/* 開いておいた入力ファイルからscanfする.戻り値はscanfと同じ. */
int lib2_scanf(char *format, ...){
static int eof_read_cnt=0;
int ret;
va_list ap;
va_start(ap, format);
ret = vfscanf(InputFileFp, format, ap);
va_end(ap);
if (ret == EOF){
eof_read_cnt++;
if (eof_read_cnt >= 2){
fprintf(stderr, "警告: lib2_scanf: すでにファイルの終端に達していますが\n");
fprintf(stderr, " 複数回scanfしようとしています\n");
}
}
return ret;
}
/* 開いておいた入力ファイルを閉じる. */
void lib2_close(void){
if (InputFileFp != NULL){
fclose(InputFileFp);
InputFileFp = NULL;
}
}
void lib2_open(char *filename);
/* 開いておいた入力ファイルからscanfする.戻り値はscanfと同じ. */
int lib2_scanf(char *fmt, ...);
/* 開いておいた入力ファイルを閉じる. */
void lib2_close(void);