我的逻辑有啥问题?尝试计算文件中包含特定字符的单词数量

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?。 这个单词是否可能出现在行尾,因此后面是换行符而不是空格? 首先,每行写多行代码是很糟糕的。 免费提示:使用有意义的变量名而不是 ij 等。ij 通常用作循环计数器(一种不成文的“规则”)-如果您给它们起有意义的名称,例如found_char_on_linefound_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;


【讨论】:

以上是关于我的逻辑有啥问题?尝试计算文件中包含特定字符的单词数量的主要内容,如果未能解决你的问题,请参考以下文章

jquery验证器避免句子中包含某些单词

如何在 R 中导入文件名中包含特定单词的 .csv 文件?

如何知道 UITextView 中包含多少个单词

计算形参s所指字符串中包含的单词个数,作为函数值返回

检查两个字符串是不是在 Python 中包含相同的单词集

DataTables 循环遍历表并删除特定列中包含特定字符串的所有行