C++ 我的逻辑有什么问题?尝试计算文件中包含特定字符的字数
第一次发布问题。正在寻求调试帮助。我试图找出我的逻辑在c++11函数中哪里是错误的。目标是在文件中搜索给定的字符,并记录它所在的字数、行数以及它在文件中出现的总次数。行数和出现的总数都是准确的,但是字数是错的,我认为这是因为我的逻辑。lwc是我创建的一个类,具有int-set方法。如果我正确地计算有特定字符的单词数量,我会错在哪里?谢谢你抽出时间C++ 我的逻辑有什么问题?尝试计算文件中包含特定字符的字数,c++,function,c++11,count,character,C++,Function,C++11,Count,Character,第一次发布问题。正在寻求调试帮助。我试图找出我的逻辑在c++11函数中哪里是错误的。目标是在文件中搜索给定的字符,并记录它所在的字数、行数以及它在文件中出现的总次数。行数和出现的总数都是准确的,但是字数是错的,我认为这是因为我的逻辑。lwc是我创建的一个类,具有int-set方法。如果我正确地计算有特定字符的单词数量,我会错在哪里?谢谢你抽出时间 void findChar(lwc *CH, string File) { ifstream file(File); int a=0; int b=0
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);
}
void findChar(lwc*CH,字符串文件)
{
ifstream文件(file);
int a=0;
int b=0;
int c=0;
弦线;
bool i=假;
bool j=假;
char ch;
而(!file.eof())
{
getline(文件,行);
for(int g=0;ggetChar())//用于计数字符
{a++;i=true;j=true;}
if(isspace(ch)&&j)//计算字数
{c++;j=false;}
}
if(i)//计算行数
{b++;i=false;}
}
CH->setWords(c);
CH->setChars(a);
CH->设定线(b);
}
正如已经指出的那样,这已经是错误的。由于以下getline()
,在错误的迭代中只会读取一个空字符串,因此此错误的影响基本上得到了缓解,但它仍然是一个错误,您应该修复它
但您的主要缺陷在于:
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
,然后您的逻辑将错误地得出结论,您的字符出现在下一行的第一个单词的某个位置,而实际上它没有出现。您假设所有单词都以空格结尾,但是一行末尾的单词可能没有尾随空格。
如果((isspace(ch)| g==line.length()-1)和&j)//要计算字符数,请考虑您的评论和答案,这就是我的想法。它在我的测试中给出了正确的输出。我取出了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;}
}
//while(!file.eof())
while(getline(文件,行))
{
//getline(文件,行);
for(int g=0;ggetChar())//用于计数字符
{a++;i=true;j=true;}
if(isspace(ch)| | g==line.length()-1)//计算字数
{
如果(j)
{c++;j=false;}
}
}
if(i)//计算行数
{b++;i=false;}
}
请阅读。是否有可能单词出现在行尾,因此后跟换行符而不是空格?首先,每行写一行以上的代码是不好的。免费提示:使用有意义的变量名,而不是i
,j
等i
和j
通常用作循环计数器(有点不成文的“规则”)-如果你给它们起了有意义的名字,比如find\u char\u on\u line
和find\u char\u in\u current\u word
你的代码,你会更清楚。伙计-谢谢你的阅读!如果i和j到达一条直线的末端,它不会设置为真吗?如果它到达行的末尾并且没有找到字符,i和j仍然会被设置为true,这是一个错误(如果我错了,请纠正我)。但考虑到你所说的,我想我找到了答案
//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;}
}