【问题标题】:Why does this code not crash the cin? char entered for an int variable c++为什么这段代码不会使cin崩溃?为 int 变量 c++ 输入的字符
【发布时间】:2016-03-14 03:25:44
【问题描述】:

有人可以向我解释为什么当用户在询问时为 int 菜单变量输入一个字符时,我的代码不会导致无限循环或崩溃吗?我已经对其进行了测试,它确实可以正常工作,但会认为它会崩溃……非常感谢!

int menu;
int drawCheck = 0;
cout << "Press 1 to play a friend\n"; 

cout << "Press 0 if for some reason you opened this and now dont want to play...\n";
cin >> menu;
while (menu!= 1)                        //User enters a number that isnt 1
{
    if(menu ==0)
    {
        exit(EXIT_SUCCESS);             //When user enters 0 the program will exit
    }
    cout << "Please enter either 1 to play a friend or 0 to exit: ";  //Will ask untill player enters either 1 or 0 
    cin >> menu; 
}

【问题讨论】:

  • 在控制台中输入字符时是否尝试打印菜单的值?
  • 从流中读取时,如果发生错误,则设置错误标志。在清除该标志之前不会进行任何读取。我不知道为什么,但是当这个错误发生时,无论变量的值是什么,0 都被设置为整数变量。根据您的代码,它适用于退出。
  • 更多,要解决这个问题[如果还没有解决]并继续你的代码,尝试将菜单设置为字符类型并将输入与“1”进行比较。
  • 对不起,如果这真的很基本,因为我是 C++ 新手,但是我将如何制作它,以便一旦我将 menu 设置为 char 变量,我可以输入数字 1 并有一个 if(menu ==1){//code} 工作成功了吗?

标签: c++ crash char int


【解决方案1】:

我已经测试过了,它确实可以正常工作......

我不知道你怎么能声称它所做的是“正确的”......如果用户输入一个字母 - 继续或终止,什么是正确的?为什么?

无论如何,给定...

int menu;
cin >> menu;

从 C++11 开始,如果将 intcin 解析为 menu 失败,则根据 22.4.2.1.2/3 将 menu 设置为零:

要存储的数值可以是以下之一:

— 如果转换函数无法转换整个字段,则为零。 ios_base::failbit 分配给 err。

...(成功解析在/超出范围的 num 的其他行为)...

因此,在 C++11 中,输入字母对 menu 的影响与输入 0 的影响相同,从而导致程序退出。

在 C++11 之前,解析失败后 menu 的值将是未定义的(即使它已被初始化),从而导致后续使用 menu 未定义行为。但是,您无法推断未定义的行为将如何表现出来 - 在程序的某些特定执行中 - 它可能会巧合地与您希望发生的情况相匹配。

【讨论】:

  • 当我说它“正常”工作时,我可能有点天真,我没有意识到菜单变量实际发生了什么。我的意思是,当我输入一个字符时,程序至少会不断地要求用户输入 1 或 0,一旦用户输入了这些值中的任何一个,程序就会继续按预期工作。谢谢你的详细回答,托尼,非常有用!
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多