C++ 关于cin、字符串和大数字-C++;

C++ 关于cin、字符串和大数字-C++;,c++,string,C++,String,我有一个非常简单的代码。只是一个if语句,其中有三个结果介于1、2和其他所有结果之间。期望的行为是,在输出适当的响应后,程序将等待用户在关闭前按enter键。但是,如果输入一个字符串,cin似乎会失败,尽管它对单个字符都不会失败。为什么呢 此外,如果我输入一个30位数字,程序将输出“nope”,但用户需要在关闭前按两次enter键。为什么 另外,我并不是在寻找问题的解决方案,只是理解为什么会发生这些事情 #include <iostream> int main() { int ch

我有一个非常简单的代码。只是一个if语句,其中有三个结果介于1、2和其他所有结果之间。期望的行为是,在输出适当的响应后,程序将等待用户在关闭前按enter键。但是,如果输入一个字符串,cin似乎会失败,尽管它对单个字符都不会失败。为什么呢

此外,如果我输入一个30位数字,程序将输出“nope”,但用户需要在关闭前按两次enter键。为什么

另外,我并不是在寻找问题的解决方案,只是理解为什么会发生这些事情

#include <iostream>

int main()
{
int choice;

std::cout<< "1 or 2?"<< std::endl;
std::cin>> choice;
if (choice == 1)
{
    std::cout<< "boom"<< std::endl;
}
else if (choice ==2)
{
    std::cout<< "bam"<< std::endl;
}
else
{
    if (std::cin.fail())
    {
        std::cin.clear();
        std::cin.ignore();
        std::cout<< "nope"<< std::endl;
    }
    else if (choice != 1 || 2)
    {
        std::cout<< "nope"<< std::endl;
    }
}
std::cin.ignore();
std::cin.get();
return 0;
}
#包括
int main()
{
智力选择;
std::cout选择;
如果(选项==1)
{
标准::cout
这行代码没有执行您怀疑的操作

您必须实际编写下面的代码

else if (choice != 1 || choice != 2)
这是很微妙的,因为我们讲英语的方式。你的代码会说“如果选择不等于1或2…似乎是合乎逻辑的,但如果你真的想一想…你拿什么来比较两个呢?我们知道我们把一个与选择相比较,但是两个呢

我展示的代码说得更准确、更精确,“否则,如果选择不等于1或选择不等于2”,现在我们知道,在or的两侧,我们将1和2的整数值与选择进行比较

注意:这里的else if实际上是完全无用的,因为你从原始的if and else if and else中知道选择不是一个或两个。你在else块中的事实已经告诉你选择不是一个或两个,所以你真的不需要这种逻辑冗余。

我一直使用
\35; includee

就在
返回0
之前,我会

_getch();
同样在您的代码中,您有
else if(选项!=1 | | 2)
,应该是

else if (choice !=1 || choice !=2)

当你输入任何大于10位的数字时,你必须在它关闭之前按两次enter键,这是因为你有一个额外的数字

std::cin.ignore()

在最后一个else语句之后

所以基本上,当它超过第10位时,它会忽略下一个数字,然后等待用户再次按回车键(或任意键),然后它就会结束

我可能错了,但我想这就是原因


int对它的大小有限制。

FYI,您可以在文件顶部键入“using namespace std”,避免反复声明std::scope的麻烦
else if(choice!=1 | | 2)
是不正确的,不做你想做的事快速评论,你可能想使用std::cin::get或std::cin::getline,我有时会遇到>>的问题。
选择!=1 | | 2
将始终是
正确的
:)从原始版本开始,如果/否则,当然,该评论@billz不会是1或2行,我会将其添加到我的回答中修正了
(choice!=1 | | choice!=2)
条件将始终为真:如果
choice==1
,那么
choice!=2
,反之亦然。我认为OP真的想要一个
&
(好吧,如果原来的if没有让这一点变得毫无意义的话)@Moah我也想到了这一点,但我不想在答案中提及,因为这行代码有太多问题。最好将这一点添加到您之前的答案中,而不是另一个答案。啊,好吧,那么主要原因是int有一个限制?我有第二个忽略()因为我希望程序保持打开状态,直到用户点击enter,程序只是在显示输出后立即关闭。我想是的。我不是专家,但我确信这就是它这样做的原因。它不应该在显示后立即关闭,即使你去掉最后一行std::cin.ignore();因为你仍然有std::cin.get();最后,它将等待用户输入某些内容,然后才会消失。事实上,你是对的--我有最后一个ignore(),因为它实际上马上就要关闭了,但我只是在第一个cin下将它向上移动,问题已经解决了。看来你是对的哈哈
else if (choice !=1 || choice !=2)