-2

私はc++を初めて使用し、ファイルからコードを読み取り、その各部分を識別子、ブラケット、キーワードなどとして分類するプログラムを作成しています。

私はifelseステートメントを使用してこれを行っていますが、角かっことセミコロンを除いて正常に機能します。

たとえば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 ;期待どおりに機能し、 andreturn 0;にトークン化されます) 。return0;

于 2013-02-05T20:35:32.773 に答える