C ++一个大小为1但不包含任何内容的字符串

时间:2014-04-10 02:12:36

标签: c++ string

我尝试读取字符串并使用它来构建bool表达式。

void Parser::parse(){
string temp="";
char c;
for(int i=0;i< _str.length()+1;i++){
    c=_str[i];
    if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' ' &&c!='>'){
        temp+=c;}
    else if(c==' '){

    }
    else{
        if (temp.substr(0,5)=="false")
            b.add_lit(false);
        else if(temp.substr(0,4)=="true")
            b.add_lit(true);
        else if(temp=="");
        else{
            cout<<"push called"<<endl;
            b.add_var(temp);
        }

        switch (c){
            case '~':{
                string name=get_next_var(_str,i);
                i=get_next_index(_str,i);
                cout<<"i is"<<i<<endl;
                b.add_var(name);
                b.add_op('~');
                b.addparent();
                temp="";
                break;}
            case '|':{
                char lop=b.get_last_op();
                if(lop=='&'||lop=='>'||lop=='='){
                    b.addparent();}
                b.add_op('|');
                temp="";
                break;}
            case '&':{
                char lop=b.get_last_op();
                if(lop=='>'||lop=='=')
                    b.addparent();
                b.add_op('&');
                temp="";
                break;}
            case '>':{
                char lop=b.get_last_op();
                if(lop=='='){
                    b.addparent();}
                b.add_op('>');
                temp="";
                break;}
            case'=':
                b.add_op('=');
                temp="";
        }

    }

        }

if (temp.substr(0,5)=="false")
    b.add_lit(false);
else if(temp.substr(0,4)=="true")
    b.add_lit(true);
else if(temp=="\0" ) return;
else if(temp!="" ) {
    cout<<"tail called, size:"<<temp.size()<<endl;
    b.add_var(temp);
}
}

当我尝试在循环中断后推送最后一个temp时,我总是得到temp这真的很奇怪。在临时字符串的末尾总有一些我不知道的东西。

假设逻辑上我得到"" temp="",我的代码会告诉我temp.size()=1,但是当我尝试打印它时,它什么都不打印。

这也是为什么我需要减少温度以获得&#34; true&#34;和&#34;假&#34;。

string get_next_var(string str,int i){
char c;
string temp="";
i++;
for(i;i< str.length();i++){
    c=str[i];
    if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' '&&c!='>')
        temp+=c;
    else if(c==' '){

    }
    else
        break;
}
return temp;
}

int get_next_index(string str,int i){
char c;
string temp="";
i++;
for(i;i< str.length();i++){
    c=str[i];
    if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' '&&c!='>')
        temp+=c;
    else if(c==' '){

    }
    else
        break;
}
return i-1;
}

1 个答案:

答案 0 :(得分:4)

  

在临时字符串的末尾总有一些我不知道的东西。

我只是快速浏览一下你的代码,但我猜这一行是错误的:

for(int i=0;i< _str.length()+1;i++) {
    .....
}

我怀疑这就是你想要的:

for(int i=0;i< _str.length();i++) {
    .....
}

这就是原因:

// Given this
string _str="abc";

// then this is what you will have
_str.length() // 3
_str[0]       // 'a'
_str[1]       // 'b'
_str[2]       // 'c'