我一直在努力做一个计算文本文件中单词数量的程序。我一直有计算单词的问题,我决定创建一个函数来执行此操作,因为我将使用此程序执行其他操作(我真的想创建一个文本编辑器,但我是一块一块地完成)。
问题是:
当我知道文本文件的字数少得多时,我的程序会返回大量的计算单词。我在这里真正想学的是如何遍历字符串数组中的字符[I] [J]。
其他信息:
这是我的代码:
答案 0 :(得分:2)
初始化number
...这就是功能fWords
中的问题。
从函数number
返回fWords
时,您获得了未初始化的值,这就是为什么您会获得一些巨大的'值。
对于逻辑部分,单词只是由空格分隔的一个或多个字母。因此,计算字母块之间的间隙,这将是所需的计数。
在fWord
中,它将是for (j = 0; array[i][j] < length; j++)
正确使用malloc
,并在您使用零值进行分配的情况下检查malloc
的返回值。
if(malloc(...)) {//ok ...} else { // not allocated }
答案 1 :(得分:2)
你需要从这里开始:
int totalLines = 0;
char **strings;
以后:
strings = malloc (sizeof(char *) * totalLines);
什么是任何数字乘以零;)?
为什么malloc不为空?
malloc()
函数分配大小字节并返回指向的指针 分配的内存。内存未初始化。如果大小为0
, 然后malloc()
返回NULL
或可以返回的唯一指针值 稍后成功传递给free()
。
答案 2 :(得分:0)
他们的代码存在一些问题:
这一行:
strings = malloc (sizeof(char *) * totalLines);
基本上是strings = malloc(0)
,因为您已将totalLines
初始化为0
。您应该根据需要分配初始大小,例如totalLines = 10
,然后realloc()
。
像这样使用realloc()
:
strings = realloc(strings, sizeof(char *) * (totalLines ) + 1 );
很危险。如果strings
为NULL
,则您将无法访问strings
。你可以这样做:
void *temp = realloc(strings, sizeof(char *) * (totalLines ) + 1);
if (temp == NULL) {
/* handle error */
} else {
strings = temp;
}
我还建议加倍totalLines
,而不是每次都加1
。这是低效的,因为在每个新行之后需要realloc()
。
如果您决定使用char content[MAX_LEN + 1];
,那么您需要fgets()
来电:
fgets(content, MAX_LEN + 1, fp)
fgets()
需要它指向的数组的确切字节数。
您还可以使用perror()
从操作系统获取反馈:
fp = fopen(argv[1], "r");
if (fp == NULL) {
perror(argv[1]);
exit(EXIT_FAILURE);