【问题标题】:c program not counting words properlyc程序没有正确计算单词
【发布时间】:2023-03-31 22:32:02
【问题描述】:

我一直在尝试做一个程序来计算文本文件中的单词数。我一直在数单词时遇到问题,我决定创建一个函数来这样做,因为我会用这个程序做其他事情(我真的很想创建一个文本编辑器,但我正在一步一步地做)。

问题是:

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

附加信息:

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

这是我的代码:

【问题讨论】:

  • 您现在使答案过时了。这不是这个网站的工作方式。如果初始化 number 没有解决您的问题,请提出不同的问题,因为不初始化 number 是一个非常严重的错误,并在给定的答案中指出。
  • strings = malloc(... 行分配了 0 个字节,因为 totalLines 为 0。
  • @IharobAlAsimi 确定我可以提出一个新问题,但基本上是一样的,我只是认为将所有内容放在同一个地方会更容易
  • x = realloc(x,... 不安全。我建议使用void* temp = realloc(strings,....); if (temp != NULL) { strings = temp; }
  • @kirkosaur,鉴于用户在您编辑问题时不会收到提醒,而不是如果他们希望回答标记为您的问题,您更有可能获得更快的如果您提出新问题,请回答(因为您是唯一收到此问题提醒的人)。

标签: c string pointers malloc fgets


【解决方案1】:

你需要从这里开始:

int  totalLines = 0;
char **strings;

及以后:

strings = malloc (sizeof(char *) * totalLines);

任何数字乘以零是多少;)?

为什么 malloc 不为空?

malloc() 函数分配 size 个字节并返回一个指向 分配的内存。内存未初始化。如果大小为0, 然后malloc() 返回NULL,或者一个唯一的指针值,它可以 稍后成功传递给free()

【讨论】:

  • 许多其他人,比如之前的那个,导致帖子中的编辑使其无效,并且也没有在main() 之前声明fWords()
【解决方案2】:

初始化number...这是函数fWords中的问题。

当您从函数 fWords 返回 number 时,您将获得一个未初始化的值,这就是您获得一些“巨大”值的原因。

对于逻辑部分,单词只不过是一个或多个由空格分隔的字母。因此,计算大块字母之间的间隙,这将是所需的计数。

fWord 中将是for (j = 0; array[i][j] < length; j++)

正确使用malloc 并检查malloc 的返回值,在您使用零值进行分配的情况下。

if(malloc(...)) {//ok ...} else { // not allocated }

【讨论】:

  • 哇,感谢您的快速回答和多哈!至少这解决了这个问题,现在我意识到它实际上并没有计算任何东西
  • 我的迭代方式是否正确?因为我之前尝试过输入文本,并且它使用相同的逻辑正常工作。
  • @kirkosaur 你编译器不给你警告吗?
【解决方案3】:

您的代码存在一些问题:

  • 这一行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2022-07-14
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多