c程序没有正确计算单词

时间:2017-02-09 00:44:06

标签: c string pointers malloc fgets

我一直在努力做一个计算文本文件中单词数量的程序。我一直有计算单词的问题,我决定创建一个函数来执行此操作,因为我将使用此程序执行其他操作(我真的想创建一个文本编辑器,但我是一块一块地完成)。

问题是:

当我知道文本文件的字数少得多时,我的程序会返回大量的计算单词。我在这里真正想学的是如何遍历字符串数组中的字符[I] [J]。

其他信息:

  1. 如果我执行一个简单的循环来打印所有字符串,那么执行计数的函数可以打印所有字符串。这意味着它已正确传递了字符串。
  2. 我正在向函数发送正确数量的行,我已经仔细检查过了。
  3. 这是我的代码:

3 个答案:

答案 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 );
    

    很危险。如果stringsNULL,则您将无法访问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);