【问题标题】:Why does this C++ code print out variables when it is not supposed to?为什么这个 C++ 代码不应该打印出变量?
【发布时间】:2020-08-07 19:05:33
【问题描述】:

我有一个非常简单的 C++ 代码,它要求在一个循环中输入两个整数,并在每次迭代中打印它们,直到用户输入字符“|”。代码如下:

int main() {                                                                    
    int in_int1;                                                                
    int in_int2;                                                                

    cout << endl << "Enter numbers one at a time. Enter '|' to end.";           
    cout << endl << ">> ";                                                      
    while (cin >> in_int1 && in_int1 != '|') {                                  

        cout << ">> ";                                                          
        cin >> in_int2;                                                         

        if (in_int2 != '|') {                                                   
             cout << "int 1: " << in_int1 << endl;                              
             cout << "int 2: " << in_int2 << endl;                              
             cout << endl << ">> ";                                             
        } else break;                                                           
    }                                                                           

    return 0;                                                                   
}

这是一个完全符合预期的示例运行:

Enter numbers one at a time. Enter '|' to end.
>> 12
>> 44
int 1: 12
int 2: 44

>> 98
>> 45
int 1: 98
int 2: 45

>> |

程序按预期终止。

这是一个奇怪的地方的示例:

Enter numbers one at a time. Enter '|' to end.
>> 54
>> |
int 1: 54
int 2: 0

程序终止

如您所见,即使代码从未输入 if-block,它也会打印值。
发生了什么?为什么程序打印两个整数而没有进入打印指令所在的块?每次我输入第一个数字并输入“|”时都会发生这种情况在第二个输入提示。

更新
以下代码按预期工作:

int main() {                                                                    
    int in_int1;                                                                
    int in_int2;                                                                

    cout << endl << "Enter numbers one at a time. Enter '|' to end.";           
    cout << endl << ">> ";                                                      
    while (cin >> in_int1) { // CHANGE 1: the second condition was unnecessary 
        // because the condition fails when user enters non numeric
        // character anyway. Besides, I was comparing int with char.                                                    

        cout << ">> ";                                                          

        if (cin >> in_int2) { // CHANGE 2: similar logic applies here.                                                   
             cout << "int 1: " << in_int1 << endl;                              
             cout << "int 2: " << in_int2 << endl;                              
             cout << endl << ">> ";                                             
        } else {                                                                
            break;                                                              
        }                                                                       
    }                                                                           

    return 0;                                                                   
}

而不是输入'|'为了终止程序,我在这里的评论者的帮助下发现,输入 124 会使我的程序按预期运行。我发现将int 与没有显式转换的char 进行比较通常是一个坏主意,因为编译器不会对此发出警告,而且有时会产生意想不到的结果。

【问题讨论】:

  • 您将intchar 进行比较
  • 尝试阅读“|”作为整数失败。你可以通过输入 124 让它停止。(练习:找出原因。)
  • cin &gt;&gt; in_int2 尝试读取一个整数,但| 不是整数。
  • @PPrasai 因为那是'|' 的ASCII 值。并且您的第一次运行终止,因为cin 条件变为false 当它没有读取整数时
  • “如果是这种情况,那么 while 循环内的第一个输入也不应该起作用”——这是一个过早的结论。您的 while 循环会检查超出您的 if 语句检查的额外条件...

标签: c++


【解决方案1】:

这个条件

if (in_int2 != '|') 

只有在您输入 | 的 ASCII 值时才能为假。您可能会天真地认为输入 | 被转换为 ASCII 值并存储在 in_int2 中。但是,这不会发生。相反,如果用户没有输入整数,std::cin &gt;&gt; in_int2 会失败。

如果您想检查用户输入,您可以将输入读取为std::string,首先检查它是否有效,然后才将其转换为int。通常,您应该始终检查通过std::cin 输入是否成功,然后检查流的状态(正如您正确读取in_int1 所做的那样)。

请注意,您的第一个示例也会因为此条件的第一部分而终止:

 while (cin >> in_int1 && in_int1 != '|') {

当用户输入| 时,输入失败,cin 转换为bool,在这种情况下为false。由于&amp;&amp; in_int1 != '|',第一个示例没有终止。同样,只有当您输入了一个有效的整数(即条件的第一部分计算为true)并且该整数是| 的ASCII 代码时,该部分条件才会触发。

【讨论】:

  • 谢谢。我现在明白了。但让我头疼的是,为什么第二次检查会打印值但不提示输入?
  • @PPrasai 我不太明白,在您的第二个示例中,有两个用户输入。查看编辑,也许可以澄清
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2016-11-19
相关资源
最近更新 更多