解析字符串的问题

时间:2013-12-08 17:04:59

标签: c++ string find

我想在每次计数到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;
    }
}

2 个答案:

答案 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