Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么当我输入一个数字时程序结束? 几天前我开始在C++上编程,有些东西真的给我带来麻烦:_C++ - Fatal编程技术网

为什么当我输入一个数字时程序结束? 几天前我开始在C++上编程,有些东西真的给我带来麻烦:

为什么当我输入一个数字时程序结束? 几天前我开始在C++上编程,有些东西真的给我带来麻烦:,c++,C++,每当我输入数字时,程序结束 代码: 使用名称空间std; int main() { 整数输入; 不能进入; cout从流中读取一个且仅读取一个字符,因此在输入数字后程序结束是完全正常的 看看这个方法,或者更简单一些,它不需要动态缓冲区 如果您需要更多关于C++中基本IO的信息,您可以阅读以下文档: 使现代化 正如在评论中所述,我误解了这个问题,我最初认为只有一个数字被读入变量 再次仔细阅读后,我无法理解问题所在。原因是您正在使用 cin.get(); return 0; 在程序结束时,cin.

每当我输入数字时,程序结束

代码:

使用名称空间std;
int main()
{
整数输入;
不能进入;
cout从流中读取一个且仅读取一个字符,因此在输入数字后程序结束是完全正常的

看看这个方法,或者更简单一些,它不需要动态缓冲区

如果您需要更多关于C++中基本IO的信息,您可以阅读以下文档:

使现代化 正如在评论中所述,我误解了这个问题,我最初认为只有一个数字被读入变量


再次仔细阅读后,我无法理解问题所在。

原因是您正在使用

cin.get();
return 0;
在程序结束时,
cin.get()
读取您输入的数字,然后直接转到
返回0;
从而结束程序

要停止此操作,您可以在返回0之前添加一个额外的
cin.get();
或使用


之前,返回0;
而不是您需要做的就是使用读取整数后剩余的换行符

这在java中也会发生

using namespace std;

int main()
{
    int entry;

    cout << "Write a number: ";
    cin >> entry;
    cout << entry;

    cin.get(); //Consume newline

    cin.get();
    return 0;
}
使用名称空间std;
int main()
{
整数输入;
不能进入;

cout这里有一个稍微改进的版本,可能更接近您想要的:

#包括
#包括
#包括
int main()
{
int n;
std::字符串行;
while(true)
{
std::cout>n){break;}
}

std::难道你的程序运行正常。它会完全按照你告诉它的去做。引用Brian Kernighan(我认为):“你看到的只是你得到的”。你想要什么行为?输入数字后,你想要的行为是什么?@AndréCaron,除非你的编译器有错误-这里不是这样,但我以前见过:)但输入数字并按enter键后,它就结束了。它不会打印它
std::basic_istream::getline()
需要使用动态缓冲区,这对初学者来说是一件可怕的事情。相反,我更喜欢。此外,我认为
cin.get()
会立即返回,而不是阻塞,因为行尾字符(至少,在同一行输入空格后的任何内容也应该存在)仍然在缓冲区中,因为在调用
istream::operator>
后它没有被消耗。它肯定不会在一个数字后结束。行
cin>>条目
肯定采用整数?(更新:@AndréCaron刚刚说了我接下来要说的内容。我认为该程序已经正确了!)我不知道该程序是否“正确”从某种意义上说,是作者的恶意行为,但我绝对误读了代码……在仔细阅读了一遍之后,我必须承认我也不知道哪里出了问题。cin.get()不读取数字。数字由
cin>>条目读取,看起来是正确的。程序读取数字并打印它-这是正确的,不是吗?@Aaron我想cin.get只是读取缓冲区中的换行符。AFAIK,
系统(“暂停”);
是一种仅适用于DOS的解决方案,仅适用于Windows。请不要在没有警告的情况下推荐此解决方案。是的,但它会在打印之前结束。我不认为仅适用于DOS的解决方案通常适用于Windows…为此有一个内置的Windows API调用;它被巧妙地命名为
Sleep()。但是这并不是你真正需要的。NIKO:<代码>返回0;< /> >在代码的结尾。>主< /代码>。@尼科德拉·科维:这是C++,而不是C89。你说得对,我忘了,他们把它编译成编译器,因为程序员是。lazy@NikoDrašković:嗯……编译器这样做是因为标准这么说。C99也规定了这一点l、 顺便说一句。@LeandroTheBest是最好的实践。您的大多数编程可能都会处理GUI,您只需触摸cout和cin进行调试。@LeandroTheBest但是,为了完整起见,Kerrek的答案是,如果您需要从无效输入中恢复,您将使用它。很好,那么cin呢。ignore();如果我将它放在每个变量之后,它似乎也会起作用(cin>>变量)
system("Pause");
using namespace std;

int main()
{
    int entry;

    cout << "Write a number: ";
    cin >> entry;
    cout << entry;

    cin.get(); //Consume newline

    cin.get();
    return 0;
}
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    int n;
    std::string line;

    while (true)
    {
        std::cout << "Please enter an integer: ";

        if (!(std::getline(std::cin, line))) { return 1; /* error! */ }

        std::istringstream iss(line);
        if (iss >> n) { break; }
    }

    std::cout << "Thank you. You said: " << n
              << "\n\nPlease press Enter to quit.";

    std::getline(std::cin, line);
}