gpt4 book ai didi

c++ - 使用 strchr 重载 >>

转载 作者:行者123 更新时间:2023-11-28 05:46:38 24 4
gpt4 key购买 nike

我正在尝试重载 >> 运算符以读取单个(使用 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;,包括 iostreamcstring

最佳答案

这里有一些错误。首先,让我们修复您的支撑。只是总是使用大括号。很难看出什么与什么对齐:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com