如何将 fgets 字符串结果存储到 char 数组中?
How to store fgets string results into an char array?
我目前收到以下错误
Process terminated with status -1073741819
我怀疑是我的 fgets()
但我不知道为什么会这样,任何帮助将不胜感激。
//Gets Dictionary from file
char* GetDictionary() {
int ArraySize;
int i = 0;
FILE * DictionaryFile;
//Gets first line (in this case it is the amount of Lines)
DictionaryFile = fopen("dictionary.txt", "r");
fscanf(DictionaryFile,"%d", &ArraySize);
ArraySize = ArraySize + 1;
printf("%d", ArraySize);
fclose(DictionaryFile);
//Gets the array
char* Dictionary = malloc(sizeof(char)*ArraySize);
char Temp[ArraySize];
char TempArray[ArraySize];
DictionaryFile = fopen("dictionary.txt", "r");
while(fgets(Temp, sizeof Temp, DictionaryFile)!=NULL) {
Dictionary[i] = Temp;
//Check The array
printf("%s", Dictionary[i]);
i++;
}
fclose(DictionaryFile);
return Dictionary;
}
您可能希望 Dictionary
是一个 char 字符串数组。即Dictionary
是一个数组,数组中的每个元素都是一个char *
。这使得 Dictionary
成为 char **
.
对于此示例,最直接的方法可能是为 Dictionary
数组本身分配内存,然后为其内容分配内存。当然,完成后您需要释放所有这些。
char **Dictionary = malloc(sizeof(char *) * ArraySize);
for (int i = 0; i < ArraySize; i++) {
Dictionary[i] = malloc(ArraySize);
}
有更好的方法可以做到这一点。一方面,您可能只在需要时为每个 fgets()
return 分配内存。您也可以使用 strdup()
只分配您需要的内存。你也可以从调用者那里传入 Dictionary
,已经分配了,所以你不用担心在这里分配它。
稍后在您的程序中,正如@WhozCraig 指出的那样,您需要复制 Temp 中的字符串,例如 strcpy(Dictionary[i], Temp)
,以代替 Dictionary[i] = Temp
。我也很惊讶没有生成编译器警告!
-1073741819 --> C0000005 可能具有一定意义。或许用下面来辨别它的意思。
puts(strerror(-1073741819));
代码有很多问题:这里有一些更正以帮助您继续。
1) 分配一个指针数组,而不是char
的数组
// char* Dictionary = malloc(sizeof(char)*ArraySize);
char** Dictionary = malloc(ArraySize * sizeof *Dictionary);
2) 形成一个大缓冲区来读取每一行
char Temp[100];
3) 读完每一行后,去掉可能尾随的'\n'
size_t len = strlen(Temp);
if (len && Temp[len-1] == '\n') Temp[--len] = 0;
4) 为那个词分配内存并保存
Dictionary[i] = malloc(len + 1);
assert(Dictionary[i]);
memcpy(Dictionary[i], Temp, len + 1);
5) 健壮的代码在完成前释放它的分配
6) 代码读取 "amount of Lines" 两次,因为文件被打开两次。保持文件打开(而不是重新打开它)。
我目前收到以下错误
Process terminated with status -1073741819
我怀疑是我的 fgets()
但我不知道为什么会这样,任何帮助将不胜感激。
//Gets Dictionary from file
char* GetDictionary() {
int ArraySize;
int i = 0;
FILE * DictionaryFile;
//Gets first line (in this case it is the amount of Lines)
DictionaryFile = fopen("dictionary.txt", "r");
fscanf(DictionaryFile,"%d", &ArraySize);
ArraySize = ArraySize + 1;
printf("%d", ArraySize);
fclose(DictionaryFile);
//Gets the array
char* Dictionary = malloc(sizeof(char)*ArraySize);
char Temp[ArraySize];
char TempArray[ArraySize];
DictionaryFile = fopen("dictionary.txt", "r");
while(fgets(Temp, sizeof Temp, DictionaryFile)!=NULL) {
Dictionary[i] = Temp;
//Check The array
printf("%s", Dictionary[i]);
i++;
}
fclose(DictionaryFile);
return Dictionary;
}
您可能希望 Dictionary
是一个 char 字符串数组。即Dictionary
是一个数组,数组中的每个元素都是一个char *
。这使得 Dictionary
成为 char **
.
对于此示例,最直接的方法可能是为 Dictionary
数组本身分配内存,然后为其内容分配内存。当然,完成后您需要释放所有这些。
char **Dictionary = malloc(sizeof(char *) * ArraySize);
for (int i = 0; i < ArraySize; i++) {
Dictionary[i] = malloc(ArraySize);
}
有更好的方法可以做到这一点。一方面,您可能只在需要时为每个 fgets()
return 分配内存。您也可以使用 strdup()
只分配您需要的内存。你也可以从调用者那里传入 Dictionary
,已经分配了,所以你不用担心在这里分配它。
稍后在您的程序中,正如@WhozCraig 指出的那样,您需要复制 Temp 中的字符串,例如 strcpy(Dictionary[i], Temp)
,以代替 Dictionary[i] = Temp
。我也很惊讶没有生成编译器警告!
-1073741819 --> C0000005 可能具有一定意义。或许用下面来辨别它的意思。
puts(strerror(-1073741819));
代码有很多问题:这里有一些更正以帮助您继续。
1) 分配一个指针数组,而不是char
// char* Dictionary = malloc(sizeof(char)*ArraySize);
char** Dictionary = malloc(ArraySize * sizeof *Dictionary);
2) 形成一个大缓冲区来读取每一行
char Temp[100];
3) 读完每一行后,去掉可能尾随的'\n'
size_t len = strlen(Temp);
if (len && Temp[len-1] == '\n') Temp[--len] = 0;
4) 为那个词分配内存并保存
Dictionary[i] = malloc(len + 1);
assert(Dictionary[i]);
memcpy(Dictionary[i], Temp, len + 1);
5) 健壮的代码在完成前释放它的分配
6) 代码读取 "amount of Lines" 两次,因为文件被打开两次。保持文件打开(而不是重新打开它)。