在C中得到负值的字计数器

在C中得到负值的字计数器,c,char,word,counter,C,Char,Word,Counter,我正在尝试开发这个单词计数器(以及行计数器和字符计数器)。规则是,除了由空格、制表符、新行、分号和连字符分隔的任何内容外,所有内容都是一个单词。例如: “xyz”开始;“嘿..你好吗”每个词都是一个单词,“嘿:你”“玉米饼”每个词都是两个单词 我的做法如下: #include <stdio.h> #include <stdlib.h> int main(){ int charHolder, result, wordCount, lineCount = 0;

我正在尝试开发这个单词计数器(以及行计数器和字符计数器)。规则是,除了由空格、制表符、新行、分号和连字符分隔的任何内容外,所有内容都是一个单词。例如: “xyz”开始;“嘿..你好吗”每个词都是一个单词,“嘿:你”“玉米饼”每个词都是两个单词

我的做法如下:

#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);
}
Number of char: 1130 
Number of lines: 20 
Number of words: -4195164 
有人知道我做错了什么吗?谢谢你的帮助

您应该尝试以下方法:

int charHolder = 0, result = 0, wordCount = 0, lineCount = 0;
你应该试试这个:

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

您似乎觉得此行将所有四个变量初始化为
0

int charHolder, result, wordCount, lineCount = 0;

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

您似乎感觉这行将所有四个变量初始化为
0

int charHolder, result, wordCount, lineCount = 0;

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

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

int charHolder, result, wordCount, lineCount = 0;
正在初始化
行计数
,要使其正常工作,您需要这样的东西

int charHolder, result, wordCount, lineCount;
charHolder = result = wordCount = lineCount = 0;
我一点也不喜欢,但似乎这就是你的意思


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

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

int charHolder, result, wordCount, lineCount = 0;
正在初始化
行计数
,要使其正常工作,您需要这样的东西

int charHolder, result, wordCount, lineCount;
charHolder = result = wordCount = lineCount = 0;
我一点也不喜欢,但似乎这就是你的意思


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

您忘记初始化所有变量,但
行数
。通过Valgrind运行程序可以帮助您找到这些bug。此外,您还需要
#包括
。最后,
int recursiveSeparatorCheck(charOther)
应该是
int recursiveSeparatorCheck(int charOther)
。请注意,您可以用
strchr(“\t\n:-”,charOther)!=NULL
。如果代码每行只列出一个变量声明,那么这个问题就不会发生。这就产生了这样一种想法,“仅仅因为某个特定的代码序列可以被编写/编译并不意味着它应该被使用。这也是为什么所有局部变量都应该在声明中初始化的一个主要示例您忘记了初始化所有变量,但是
lineCount
。通过Valgrind运行程序可以帮助您找到这些bug。此外,您还需要
#包括
。最后,
int recursiveSeparatorCheck(charOther)
应该是
int recursiveSeparatorCheck(int charOther)
。请注意,您可以用
strchr(“\t\n:-”,charOther)!=NULL
。如果代码每行只列出一个变量声明,那么这个问题就不会发生。这就产生了这样一种想法,“仅仅因为某个特定的代码序列可以被编写/编译并不意味着它应该被使用。这也是为什么所有局部变量都应该在声明中初始化的一个主要例子