我的逻辑有啥问题?尝试计算文件中包含特定字符的单词数量
Posted
技术标签:
【中文标题】我的逻辑有啥问题?尝试计算文件中包含特定字符的单词数量【英文标题】:What is wrong with my logic? Trying to count amount of words in a file that contain a specific character我的逻辑有什么问题?尝试计算文件中包含特定字符的单词数量 【发布时间】:2017-03-07 22:34:52 【问题描述】:第一次发帖。寻求调试帮助。我试图找出我的逻辑在 c++11 函数中的错误所在。目标是在文件中搜索给定字符,并记录它所在的字数、所在的行数以及它在文件中出现的总次数。行数和总出现次数是准确的,但我认为是因为我的逻辑导致的字数关闭。 lwc 是我创建的一个类,具有 int set 方法。正确计算其中包含特定字符的单词的数量我哪里错了?感谢您的宝贵时间。
void findChar(lwc *CH, string File)
ifstream file(File);
int a=0;
int b=0;
int c=0;
string line;
bool i = false;
bool j = false;
char ch;
while (!file.eof())
getline(file, line);
for (int g=0; g<line.length(); g++)
ch = line[g];
if (ch == CH->getChar()) //to count characters
a++; i= true; j = true;
if (isspace(ch) && j) //to count words
c++; j=false;
if (i) //to count lines
b++; i = false;
CH->setWords(c);
CH->setChars(a);
CH->setLines(b);
【问题讨论】:
请阅读Why is iostream::eof inside a loop condition considered wrong?。 这个单词是否可能出现在行尾,因此后面是换行符而不是空格? 首先,每行写多行代码是很糟糕的。 免费提示:使用有意义的变量名而不是i
、j
等。i
和 j
通常用作循环计数器(一种不成文的“规则”)-如果您给它们起有意义的名称,例如found_char_on_line
和found_char_in_current_word
,您的代码就会更清晰。
老兄- 感谢您的阅读!
【参考方案1】:
while (!file.eof())
正如已经指出的那样,这已经是错误的。由于下面的getline()
在错误的迭代中只会读取一个空字符串,因此这个 bug 的影响大部分都得到了缓解,但它仍然是一个 bug,你应该修复它。
但你的主要错误在这里:
if (ch == CH->getChar()) //to count characters
a++; i= true; j = true;
if (isspace(ch) && j) //to count words
c++; j=false;
这依赖于每个单词后跟一个空格,以便将 j
重置为 false。您正在使用 j
作为一个标志,当字符作为单词的一部分时设置,因此当遇到单词后面的空格时,c
会增加(您的字符出现的单词数),并且j
被重置。
但是,您会惊讶地发现,并非文件中的每个单词都后跟空格。每行的最后一个单词后面不会有空格(除非行尾有明确的尾随空格)。惊喜!
因此,您将在 j
剩余设置为 true 的情况下完成当前行的迭代。当循环再次迭代时,在下一行,j
将保持设置为true
,然后您的逻辑将错误地得出结论,即您的角色出现在下一行的第一个单词的某个地方,而实际上并没有。
【讨论】:
【参考方案2】:您假设所有单词都以空格结尾,但行尾的单词可能没有尾随空格。 if ((isspace(ch) || g == line.length() - 1) && j ) //计算字符数
【讨论】:
如果 i 和 j 到达行尾,这不会将其设置为 true 吗?如果它到达行尾并且没有找到字符,i 和 j 仍将设置为 true,这是一个错误(如果我错了,请纠正我)。但是考虑到你所说的,我想我找到了答案【参考方案3】:考虑到您的 cmets 和答案,这就是我想出的。它在我的测试中给出了正确的输出。我取出 file.eof(),将 getline(file,line) 加到 while 语句中,并添加 line.length()-1 以适应没有空格字符的字符串结尾。
//while (!file.eof())
while (getline(file,line))
//getline(file, line);
for (int g=0; g<line.length(); g++)
ch = line[g];
if (ch == CH->getChar()) //to count characters
a++; i= true; j = true;
if (isspace(ch) || g == line.length()-1) // to count words
if(j)
c++;j=false;
if (i) //to count lines
b++; i = false;
【讨论】:
以上是关于我的逻辑有啥问题?尝试计算文件中包含特定字符的单词数量的主要内容,如果未能解决你的问题,请参考以下文章