fscanf 在尝试扫描文本文件的其余部分时使程序崩溃
fscanf crashing the program as it tries to scan in rest of text file
我有一个名为 dictionary 的文本文件,第一行是一个整数,告诉我们字典中有多少个单词。第一行之后是后续的一系列行,每行都有一个词。
出于某种原因,fscanf 可以毫无问题地读取第一行(整数),但是当我尝试使用循环读取字符串时,它会立即崩溃。我不确定是什么错误,因为视觉工作室只是在其他文件中给我一个未处理的异常(我假设这是 fscanf 函数的代码)。
#include <stdio.h>
#include <stdlib.h>
#define MAXWORDLENGTH 19
const int DX_SIZE = 8;
const int DX[] = {-1,-1,-1,0,0,1,1,1};
const int DY[]= {-1,0,1,-1,1,-1,0,1};
char** storeDictionary();
int main(void){
char** dictionary;
dictionary = storeDictionary();
system("pause");
return 0;
}
char** storeDictionary(){
int i;
int j;
FILE *fp;
char** dictionary;
fp = fopen("dictionary.txt", "r");
int amountOfWords;
fscanf(fp,"%d", &amountOfWords);
dictionary = calloc(amountOfWords, sizeof(char*));
for (i = 0; i < MAXWORDLENGTH; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
if (dictionary == NULL){
printf("Allocation failed");
}
for(i=0; i< amountOfWords; i++){
for (j = 0; j < MAXWORDLENGTH; j++){
fscanf(fp, "%s", dictionary[i]);
}
}
fclose(fp);
for(i =0; i<amountOfWords;i++){
printf("%s",dictionary[i]);
printf("\n");
}
return dictionary;
}
另外我可能动态分配错误,但我尝试了各种方法并在循环中的 fscanf 处遇到了同样的崩溃。
您在此处绑定了错误的循环:
for (i = 0; i < MAXWORDLENGTH; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
改为:
for (i = 0; i < amountOfWords; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
Jonathan Leffler 还指出,这些 calloc
调用中使用的大小是错误的。 sizeof(char *)
在这些调用中应该是 sizeof(char)
。
当然,你需要保证每个字符串的长度不超过MAXWORDLENGTH - 1
个字符。
我有一个名为 dictionary 的文本文件,第一行是一个整数,告诉我们字典中有多少个单词。第一行之后是后续的一系列行,每行都有一个词。
出于某种原因,fscanf 可以毫无问题地读取第一行(整数),但是当我尝试使用循环读取字符串时,它会立即崩溃。我不确定是什么错误,因为视觉工作室只是在其他文件中给我一个未处理的异常(我假设这是 fscanf 函数的代码)。
#include <stdio.h>
#include <stdlib.h>
#define MAXWORDLENGTH 19
const int DX_SIZE = 8;
const int DX[] = {-1,-1,-1,0,0,1,1,1};
const int DY[]= {-1,0,1,-1,1,-1,0,1};
char** storeDictionary();
int main(void){
char** dictionary;
dictionary = storeDictionary();
system("pause");
return 0;
}
char** storeDictionary(){
int i;
int j;
FILE *fp;
char** dictionary;
fp = fopen("dictionary.txt", "r");
int amountOfWords;
fscanf(fp,"%d", &amountOfWords);
dictionary = calloc(amountOfWords, sizeof(char*));
for (i = 0; i < MAXWORDLENGTH; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
if (dictionary == NULL){
printf("Allocation failed");
}
for(i=0; i< amountOfWords; i++){
for (j = 0; j < MAXWORDLENGTH; j++){
fscanf(fp, "%s", dictionary[i]);
}
}
fclose(fp);
for(i =0; i<amountOfWords;i++){
printf("%s",dictionary[i]);
printf("\n");
}
return dictionary;
}
另外我可能动态分配错误,但我尝试了各种方法并在循环中的 fscanf 处遇到了同样的崩溃。
您在此处绑定了错误的循环:
for (i = 0; i < MAXWORDLENGTH; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
改为:
for (i = 0; i < amountOfWords; i++){
dictionary[i] = calloc(MAXWORDLENGTH, sizeof(char*));
}
Jonathan Leffler 还指出,这些 calloc
调用中使用的大小是错误的。 sizeof(char *)
在这些调用中应该是 sizeof(char)
。
当然,你需要保证每个字符串的长度不超过MAXWORDLENGTH - 1
个字符。