我正在从文件中读取单词,确切的编号为2243。并且我正在尝试将它们存储在数组中,以便以后可以在程序中读取它们。代码是内部函数。该文件没有句子,只有一个单词在另一个单词下面。
char** fill_word_array(char* filename){
int i = 0, j = 0;
int lines = 0;
char str[20];
char *array[i][j];
array[i][j] = malloc(lines * sizeof(char*));
FILE * fp = fopen("words.txt", "r");
if (fp == NULL)
{
printf("Cannot open file");
return 0;
}
while (fscanf(fp, "%s", str) != EOF)
{
lines++;
}
printf("%d\n", lines);
fseek(fp, 0, SEEK_SET);
array[i][j] = malloc(sizeof(char*) * lines);
for(i = 0; i <= lines; i++)
{
strcpy(array[lines][j], str);
printf("%s", array[i][j]);
}
return 0;
}
此代码仅打印文件的最后一个字,如http://tinypic.com/r/2zhjmgx/9所示。
答案 0 :(得分:1)
像char *array[i][j]
和i==0
和j==0
这样的声明将保留大小为0的数组,这样即使位置array[0][0]
也无法合法访问(未定义的行为)。因此,当您编写array[i][j] = malloc(lines * sizeof(char*))
时,您已经写入array[0][0]
并产生UB。
通常,一个人因向寻求帮助的人提供解决方案而受到社区的惩罚,从而使他有机会自己创造经验。但是,对于您的成熟程度,在我看来练习很辛苦,因此我将按照您的方法提供一种解决方案,并描述要考虑的事情。
希望有帮助。
采用您的方法,您需要...
NULL
指针(否则用户
您的结果将不知道在哪里停止。代码如下:
char** fill_word_array(char* filename){
int words = 0;
char str[100];
char **array;
FILE * fp = fopen("words.txt", "r");
if (fp == NULL)
{
printf("Cannot open file");
return 0;
}
while (fscanf(fp, "%s", str) != EOF)
{
words++;
}
printf("%d\n", words);
fseek(fp, 0, SEEK_SET);
array = malloc(sizeof(char*) * (words+1));
for(int i = 0; i < words && fscanf(fp, "%s", str) != EOF; i++)
{
array[i] = strdup(str);
}
array[words] = NULL;
return array;
}
int main() {
char **array = fill_word_array("someFile.txt");
for (int i=0; array[i] != NULL; i++) {
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
}