Я знаю, где ошибка в следующем коде, строка 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, как и следовало ожидать с символом. Однако, если я попытаюсь распечатать его онлайн, я получу
Error: String length < 2 :><:
Обратите внимание, что между маркерами ничего не напечатано>
Вы не сказали нам, что было на самом деле, но это, вероятно, непечатный символ в ASCII.
Это довольно странное использование строк.
Других решений пока нет …