【问题标题】:Word counter getting negative value in C字计数器在C中获得负值
【发布时间】:2015-02-20 21:10:10
【问题描述】:

我正在尝试开发这个单词计数器(以及行和字符计数器)。规则是,除了由空格、制表符、换行符、分号和连字符分隔的任何内容之外,所有内容都是单词。例如: 'xyz' 'go;down​​' 'hey..howareyou' 都是 1 个单词,'hey:you' 'tacos-burrito' 都是 2 个单词。

我的方法如下:

#include <stdio.h>
#include <stdlib.h>

int main(){

    int charHolder, result, wordCount, lineCount = 0;

    int recursiveSeparatorCheck(charOther){
        if(isspace(charOther)||charOther=='\t'||charOther=='\n' || charOther ==':' || charOther == '-')
            return 1;
        return 0; 
    }


    while ((charHolder = getchar()) != EOF){
        if(charHolder == '\n')
            lineCount++;
        result++;
        if(recursiveSeparatorCheck(charHolder) == 1)
            continue;
        wordCount++;


    }


    printf("Number of char: %d \n", result);
    printf("Number of lines: %d \n", lineCount);
    printf("Number of words: %d \n", wordCount);
    return (EXIT_SUCCESS);
}

当我运行我的程序并输入它以读取一个包含 20 行和 160 个字的文件时,它会打印以下内容:

Number of char: 1130 
Number of lines: 20 
Number of words: -4195164 

有人知道我做错了什么吗?感谢您的帮助!

【问题讨论】:

  • 您忘记初始化除lineCount 之外的所有变量。通过 Valgrind 运行你的程序可以帮助你找到这样的错误。另外,您需要#include &lt;ctype.h&gt;。最后,int recursiveSeparatorCheck(charOther) 应该是int recursiveSeparatorCheck(int charOther)
  • 只是一个注释,但您可以用strchr(" \t\n:-", charOther) != NULL 替换整个长 if 子句。
  • 如果代码每行只列出一个变量声明,那么这个问题就不会发生。这意味着“仅仅因为可以编写/编译特定的代码序列并不意味着应该使用它。这也是为什么所有局部变量都应该在声明中初始化的一个典型例子

标签: c char word counter


【解决方案1】:

您的印象似乎是这一行将所有四个变量都初始化为0

int charHolder, result, wordCount, lineCount = 0;

它没有。只有lineCount 被初始化,其余的有未定义的值。在wordCountresult 之后添加= 0 来初始化它们。

【讨论】:

    【解决方案2】:

    wordCount 未初始化,它包含不确定的值,您需要将其显式初始化为0,以及所有其他变量

    int charHolder, result, wordCount, lineCount = 0;
    

    只是初始化lineCount,要让它工作你需要这样的东西

    int charHolder, result, wordCount, lineCount;
    charHolder = result = wordCount = lineCount = 0;
    

    我一点也不喜欢,但似乎这就是你的意思。

    注意:您确实需要使用编译器警告。

    【讨论】:

      【解决方案3】:

      你应该试试这个:

      int charHolder = 0, result = 0, wordCount = 0, lineCount = 0;
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2018-06-24
        • 1970-01-01
        • 2016-03-06
        • 2023-04-10
        • 2023-03-06
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多