【发布时间】: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 <ctype.h>。最后,int recursiveSeparatorCheck(charOther)应该是int recursiveSeparatorCheck(int charOther)。 -
只是一个注释,但您可以用
strchr(" \t\n:-", charOther) != NULL替换整个长 if 子句。 -
如果代码每行只列出一个变量声明,那么这个问题就不会发生。这意味着“仅仅因为可以编写/编译特定的代码序列并不意味着应该使用它。这也是为什么所有局部变量都应该在声明中初始化的一个典型例子