我试图重载>>运算符以读取单个(使用enum Symbol {e,a,b,c,d};创建的)符号:istream & operator >> (istream & is, Symbol & sym) { Symbol Arr[]={e,a,b,c,d}; char ch; is>>ch; if (strchr("eabcd",ch)) sym=Arr[ch-'e']; else { is.unget(); is.setstate(ios::failbit); } return is;}但这会读取一些垃圾(数字)而不是我想要的内容,导致在尝试使用编辑:哦,当然,我确实在开头添加了using namespace std;,与包括iostream和cstring一样。 最佳答案 这里有些错误。首先,让我们修复支撑。只是始终使用大括号。很难看到什么与什么对齐:istream & operator >> (istream & is, Symbol & sym) { Symbol Arr[]={e,a,b,c,d}; char ch; is>>ch; if (strchr("eabcd",ch)) { sym=Arr[ch-'e']; } else { is.unget(); is.setstate(ios::failbit); } return is;}好,很好。现在,如果用户输入'a'之类的东西会发生什么。 strchr成功,然后执行sym = Arr[ch - 'e']。但是ch - 'e'在这种情况下是-4。那是某个地方的完全随机的内存,因此您将得到垃圾。要实际使用strchr,您需要执行以下操作:const char* options = "eabcd";if (const char* p = strchr(options, ch)) { sym = Arr[p - options];}但这有点可怕。我建议只使用一个开关:switch (ch) { case 'e': sym = e; break; case 'a': sym = a; break; ... default: is.unget(); is.setstate(ios::failbit);}另外,is >> ch可能会失败,并且您没有对此进行检查。你应该:istream& operator>>(istream& is, Symbol& sym) { char ch; if (is >> ch) { switch(ch) { ... } } return is;}关于c++ - 使用strchr重载>>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36094686/ 10-11 19:45