为什么输入字符串时这段C++代码会出现运行异常?
问题根因
- 输入流失败未处理:
x是int类型,输入字符串时cin >> x会执行失败,此时cin会进入失败状态,后续所有输入操作都会直接跳过不会等待用户输入。你的for循环固定执行10次,输入失败后循环会直接跑满,因此会连续打印10次"Press 1 and enter",跑完后直接执行退出逻辑,就会出现程序直接关闭的现象。 isalpha使用错误:isalpha的入参要求是字符的ASCII码值(或EOF),你传入的是int类型的数值x,逻辑完全不成立:输入字符串时内容根本不会存入x,正常输入数字时x存的是数字的数值不是输入字符的ASCII码,因此输入字母的情况永远不会被你写的判断分支捕获,不会输出"int pls"的提示。- 隐含问题:
flip函数内重复定义局部变量ans,外层声明的ans未被赋值,返回值为空;未初始化随机数种子,每次运行抛硬币的结果都是固定的。
修复参考
修改输入部分的逻辑,输入失败后重置输入流状态并清空缓冲区:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; string flip(); int x; int main() { srand(time(0)); // 初始化随机数种子 for(int i=0;i<10;++i){ cout<<"Press 1 and enter"<<endl; cin>>x; // 处理输入失败的情况 if(cin.fail()){ cout<<"int pls"<<endl; cin.clear(); // 重置cin的失败状态 // 清空输入缓冲区所有残留数据 cin.ignore(1024, '\n'); continue; } if(x==1){ flip(); cout<<"flipped"<<endl; } else{ cout<<"try again"<<endl; } } system("pause>0"); return 0; } string flip(){ int y=rand()%2; if(y==0){ cout<<"Heads"<<endl; return "Heads"; } else{ cout<<"Tails"<<endl; return "Tails"; } }
内容的提问来源于stack exchange,提问作者user11778808
相关产品推荐
相关产品推荐

