我一直在尝试做一个程序来计算文本文件中的单词数。我一直在计算单词时遇到问题,我决定创建一个函数来做到这一点,因为我将用这个程序做其他事情(我真的很想创建一个文本编辑器,但我正在一点一点地这样做(。
问题是:
当我知道文本文件的字数要少得多时,我的程序会返回大量的计数单词。我在这里真正想学习的是如何遍历字符串数组中的字符[I][J].
附加信息:
- 如果我执行一个简单的循环来打印所有字符串,则进行计数的函数可以打印所有字符串。这意味着它已正确传递字符串。
- 我正在向函数发送正确的行数,我已经仔细检查过了。
这是我的代码:
你需要从这里开始:
int totalLines = 0;
char **strings;
后来:
strings = malloc (sizeof(char *) * totalLines);
任何数字乘以零;)是多少?
为什么 malloc 不为空?
malloc()
函数分配大小字节并返回指向 分配的内存。 内存未初始化。 如果大小为0
, 然后malloc()
返回NULL
或唯一指针值,该值可以 后来成功传递给free()
。
初始化number
...这就是功能fWords
中的问题。
从函数fWords
返回number
时,您将获得一个未初始化的值,这就是您获得一些"巨大"值的原因。
对于逻辑部分,单词只不过是一个或多个由空格分隔的字母。因此,计算字母块之间的间隙,这将是所需的计数。
在fWord
,它将for (j = 0; array[i][j] < length; j++)
正确使用malloc
并检查返回值 malloc
如果您已使用零值进行分配。
if(malloc(...)) {//ok ...} else { // not allocated }
它们是您的代码的一些问题:
-
这一行:
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);