-2

我是 C++ 的新手,我正在编写一个从文件中读取代码的程序,并将其每一部分分类为标识符、括号、关键字等。

我正在使用 if else 语句执行此操作,除了括号和分号外,它工作正常。

例如if(a== "=" ) cout << "a is the equal operator"有效,但if(a== ";" ) cout << "a is a semicolon"没有。我也尝试使用比较方法,它也不起作用。

有人可以告诉我为什么会这样吗?

谢谢

void checkString(string a)

        if(a=="("){
                cout << "RPAR: " << a + "\n";
        }

        else if(a==")"){
                cout << "LPAR: " << a + "\n";
        }

        else if(a.compare("{") == 0){
                cout << "LBRAC: " << a + "\n";
        }

        else if(a=="}"){
                cout << "RBRAC: " << a + "\n";
        }

        else{
                cout << "IDENTIFIER: " << a + "\n";
        }
}

int  main (){

    std::vector<string> STRINGS;
    string STRING;
    ifstream infile;
    infile.open("m.c");
    while(getline(infile,STRING,' ')){
            STRINGS.push_back(STRING);
    }

    infile.close();
    for(int i=0; i<STRINGS.size(); i++){
            checkString(STRINGS[i]);
    }

    return 0;
}

如果 a 是括号或分号,程序将打印 IDENTIFIER: {。

4

2 回答 2

1

如果 a 是 ac 字符串,那么我会考虑使用strcmp方法。如果它们是#include <string>标题下的字符串。我会调查string::compare

于 2013-02-05T19:53:42.940 回答
0

看起来问题出在getline(infile,STRING,' ').

如果您的代码遇到\n,\t等会发生什么?它将与您的令牌一起提取,您最终会得到一个字符串,例如";\n",这与";"

更改用于标记文件的逻辑:

std::ifstream fin("m.c");
while (fin >> STRING ){
   STRINGS.push_back(STRING);
}
fin.close();

或者修剪你的绳子。


更新:

请记住,这种标记器仅在您的标记由空格分隔时才起作用(return 0 ;将按预期工作,return 0;将被标记为returnand 0;

于 2013-02-05T20:35:32.773 回答