大家好我正在尝试为一些课程实施拼写检查,但我是C的新手,只是加载字典文件正在毁了我的脑袋。以下代码编译正常,但在运行时崩溃。有时打印500行有时1500,但我不知道是什么原因导致它!
#include <string.h>
#include <stdio.h>
#include <malloc.h>
int main(int argc, char *argv[])
{
FILE *words_ptr; //pointer for words.txt
char new_word[100];
char temp_word[100];
char *dict[45440];
words_ptr = fopen( "dictionary.txt", "r" );
if(words_ptr != NULL )
{
printf( "File dictionary.txt opened\n");
int i = 0;
while (fgets(temp_word, 45440, words_ptr))
{
new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size
strcpy(new_word, temp_word); //copy contents of temp_word to new_word
dict[i] = new_word; //copy contents of new_word to i'th element of dict array
printf("printing out dict[%d]: %s\n", i, dict[i]);
i++;
}
printf("printing out dictionary1: %s\n", dict[1]);
fclose( words_ptr );
return 0;
}
else {printf( "Unable to open file words.txt\n" ); return 1;}
}
答案 0 :(得分:3)
根据手册页, calloc()函数为每个nmemb
(第一个参数)元素的size
(第一个参数)元素数组分配内存,并返回指向分配的内存。内存设置为零。
您基本上是将指针指向char并进一步将其指定给char,这没有任何意义。不要将new_word
声明为char数组,而是将其设为char *
并执行calloc
,如下所示:
char *new_word;
...
new_word = calloc(strlen(temp_word) + 1, sizeof(char));
答案 1 :(得分:2)
这一行:
<a href="javascript:void(0)" onclick="return countredirect();">Item</a>
没有提供足够的空间来复制字符串。这个字节太短,因为new_word[i] = (char)calloc(strlen(temp_word), sizeof(char)); //ensuring new_word will be the right size
不包含终止strlen()
字符。
此外,'\0'
只有100 new_word
个条目的空间 - 它甚至不是char
。这完全是无关紧要的。只需将char *
的结果直接保存到calloc()
:
dict[i]
是的,有一个名为dict[i] = strdup( temp_word );
的函数重复一个字符串。 Animated line drawing in SVG