我想在每次计数到4时输入一个新行或者如果我遇到这个字符']'。
现在,我可以让我的代码在每次计数为4时创建一个新行,但是当我为']'添加条件时,我会在每次迭代时得到一个新行。我想这可能是由我的chartDataString.find(']'引起的,但我不知道如何修复它。
你能看到这段代码的问题吗?:
int barCount = 0;
size_t start = 0;
size_t n = 0;
int charCount = 0;
while ((start = chartDataString.find(" |", start)) != string::npos) {
++barCount;
start+=2;
charCount++;
if (barCount == 4 || chartDataString.find("]")) {
//cout<<"Number of bars: "<<barCount<<endl;
chartDataString.insert(start, "\n");
barCount = 0;
charCount= 0;
}
}
答案 0 :(得分:1)
if (barCount == 4 || chartDataString.find("]"))
如果string.find()
返回string::npos
,则上述语句将评估为true
,因为string::npos
很可能不是0。
在我的机器上,它是18446744073709551615,程序转换为true
正如Anish Ram在评论中指出的那样,string::npos
is defined as:
static const size_t npos = -1;
所以,作为size_t
,它总是一个正值,当它转换为布尔值时,将评估为真。
尝试以下方法:
#include <iostream>
#include <string>
using namespace std;
int main(){
if (string::npos) cout << "Entered if statement" << endl;
else cout << "DID NOT ENTER IF STATEMENT" << endl;
}
我正在使用gcc 4.6.3,程序的输出是:
输入if语句
将您的代码更改为:
if (barCount == 4 || chartDataString.find("]") != string::npos)
事情应该运转得很好。那么他们至少应该编译....
如果您要做的是遍历字符串中的所有字符,那么您应该检查字符串中的每个位置而不是调用string::find()
在这种情况下,您应该在字符串中维护索引,然后再检查string.at(index) == ']';
。
答案 1 :(得分:0)
您正在检查chartDataString
是否包含]
chartDataString.find("]")
。此外,find
将返回找到字符的位置,如果找不到,则返回string::npos
。唯一的find
评估为false的时间是在第一个字符中找到该字符的时间。
相反,请尝试:
if(barCount == 4 || chartDataString.at(charCount) == ']') {
检查当前字符是否为]
。请注意,我不清楚你当前的角色位置是什么。您可能需要将charCount
替换为start
。