連結リストを用いて文字列を格納する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SOLAR
記事: 3
登録日時: 1年前

連結リストを用いて文字列を格納する方法

#1

投稿記事 by SOLAR » 1年前

テキストファイルから住所のデータを連結リストに格納するプログラムを作成したいのですが上手くできません。
下記のコードで実行すると連結リストにその都度格納されるのですが、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);

コード:

4
0600806 北海道札幌市北区北六条西 hokkaido sapporoshikitaku kita6-jonishi
0040021 北海道札幌市厚別区青葉町 hokkaido sapporoshiatsubetsuku aobacho
1000011 東京都千代田区内幸町 tokyoto chiyodaku uchisaiwaicho
5730171 大阪府枚方市北山 osakafu hirakatashi kitayama

box
記事: 2002
登録日時: 13年前

Re: 連結リストを用いて文字列を格納する方法

#2

投稿記事 by box » 1年前

えっと、連結リストに格納するコードの提示がないように見えるのは
こっちの目の錯覚?
今こっちに見えてるコードって、つまるところ、
ぐるぐるループしながらファイルから読んでるところだけ
しかないと思うんですけど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る