ファイルを受け取り、それを 1 行ずつ読み取り、すべての行を に*char[]
入れ、この 2 次元配列を構造体に入れ、この構造体wordlist.h を返す関数があります。
#ifndef H_WORDLIST
#define H_WORDLIST
typedef struct {
char **chWordsList;
int listlen;
}Wordlist;
Wordlist getWordlistFromFile(char *chFilename);
char *getRandomWord();
#endif
関数 (およびヘッダー):
#include "wordlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define WORDSIZE 100
Wordlist getWordlistFromFile(char *chFilename){
FILE *file = fopen(chFilename,"r");
if (file == NULL){
printf("Unable to open file %s. Check if the file exists and can be read by this user.\n",chFilename);
exit(1);
}
char chWord[WORDSIZE];
int intFileSize = 0;
//First: coundt the amount of lines in the file
while((fgets(chWord,WORDSIZE,file) != NULL)){
++intFileSize;
}
rewind(file);
char *chWordList[intFileSize];
for (int count = 0; (fgets(chWord,WORDSIZE,file) != NULL); ++count){
chWordList[count] = malloc( strlen(chWord +1));
strcpy(chWordList[count],chWord);
chWordList[count][strlen(chWord) -1] = 0;
}
fclose(file);
Wordlist wordlist;
wordlist.chWordsList = chWordList;
wordlist.listlen = intFileSize;
for (int i = 0; i < wordlist.listlen; ++i){
printf("%s\n", wordlist.chWordsList[i]);
}
return wordlist;
}
これまでのところ、これはうまく機能します。最後の for ループは、指定されたファイルのすべての行を正確に出力し、すべてが完全に期待される動作であり、完璧に機能します。さて、実際に機能を使いたいと思います。だから:私のmain.cで:
Wordlist list = getWordlistFromFile(strFilePath);
for (int i = 0; i < list.listlen; ++i){
printf("%s\n", list.chWordsList[i]);
}
これにより、最も奇妙な出力が得られます。
abacus
wordlist
(null)
(null)
��Ⳏ
E����H�E
gasses
出力は次のようになります。
abacus
amused
amours
arabic
cocain
cursor
gasses
いくつかのポインターが d か何かを取得するように思えますがfree
、他のポインターはそのまま残ります。何が起こっている?wordlist
返品前は完璧で、返品後は壊れているのはなぜですか?