【问题标题】: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);

}

【问题讨论】:

  • 这个单词是否可能出现在行尾,因此后面是换行符而不是空格?
  • 首先,每行写多行代码是很糟糕的。
  • 免费提示:使用有意义的变量名而不是 ij 等。ij 通常用作循环计数器(一种不成文的“规则”)-如果您给它们起有意义的名称,例如found_char_on_linefound_char_in_current_word,您的代码就会更清晰。
  • 老兄- 感谢您的阅读!

标签: c++ function c++11 count character


【解决方案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;}
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多