1

エラーが次のコードの 90 行目のどこにあるかはわかっていますが、なぜこのように動作するのかわかりません。

 83   string
 84   getStringId(TokenType toktype)
 85   {
 86     map<TokenType, string>::iterator pos;
 87     pos = TokenTypeMap.find(toktype);
 88     string str;
 89     if(pos != TokenTypeMap.end()) {
 90       str = pos->first;
 91     }
 92     if(str.empty()) {
 93       cerr << "Error: Invalid TokenType: " << toktype << endl;
 94       exit(EXIT_FAILURE);
 95     }
 96     /* The following if block is only here for debugging */
 97     if(str.length() == 1) {
 98       cerr << "Error: String length == 1 :>" << str << "<:"<< endl;
 99       exit(EXIT_FAILURE);
100     }
101     return str;
102   }

90 行目で、TokenType を文字列に割り当てます。TokenType は列挙型であるため、厳密な型指定のためにここで何かが発生することを期待していましたが、実際には int であるため、残念ながら警告はまったくありません。その理由は次の場所にありました。

C++ で整数を文字列に割り当てることができるのはなぜですか?

これは問題ありませんが、文字列で予想されるように、文字列が空ではなく、長さが 1 であることに気付きました。ただし、オンラインで印刷しようとすると98になります

Error: String length < 2 :><:

マーカーの間には何も印刷されていないことに注意してください >

4

1 に答える 1

1

実際の値が何であるかは教えてくれませんでしたが、おそらく ASCII では印刷できない文字です。

これはかなり奇妙な文字列の使い方です。

于 2012-11-25T01:36:59.097 に答える