为什么会跳出程序? 我刚刚开始学习C++。

为什么会跳出程序? 我刚刚开始学习C++。,c++,C++,当我执行代码时,它会毫无错误地跳出程序。为什么? #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char s1[20],s2[10]; cout<<" enter a number : "; cin.get(s1,19); cout<<" enter a number : "; ci

当我执行代码时,它会毫无错误地跳出程序。为什么?

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

  char s1[20],s2[10];
  cout<<" enter a number : ";
  cin.get(s1,19);
  cout<<" enter a number : ";
  cin.get(s2,9);

  cout<<s1<<"/n"<<s2;

  getch();

}
#包括“stdafx.h”
#包括
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
字符s1[20],s2[10];
cout方法get()最多读取“\n”字符,但不提取它

因此,如果您键入:
122345

这一行:

cin.get(s1,19);
将读取
12345
,但“\n”(通过点击创建)保留在输入流上。因此,下一行将读取:

cin.get(s2,9);
当它看到“\n”并停止时,将不读取任何内容。但它也不会提取“\n”。因此输入流仍然有“\n”。因此此行:

getch();
只需从输入流中读取“\n”字符。这将允许它完成处理并正常退出程序

好的。这就是正在发生的事情。但还有更多。您不应该使用get()读取格式化输入。请使用运算符>>将格式化数据读取为正确的类型

int main()
{
    int   x;
    std::cin >> x; // Reads a number into x
                   // error if the input stream does not contain a number.
}
由于std::cin是一个缓冲流,因此在推送和刷新流之前,数据不会发送到程序。因此,一次读取一行文本(来自用户输入),然后独立解析该行通常很有用。这允许您检查最后一次用户输入的错误(逐行打印,如果有错误,则拒绝)

如果你想获得高级,你也可以看看Boost LIBS。它们一般提供一些不错的代码,作为C++程序,你应该知道Boost的内容。但是我们可以把上面写的为:

int main()
{
    bool inputGood = false;
    do
    {
        try
        {
           std::string  line;
           std::getline(std::cin, line);   // Read a user line (throws away the '\n')

           int  x    = boost::lexical_cast<int>(line);
           inputGood = true;               // If we get here then lexical_cast worked.
        }
        catch(...) { /* Throw away the lexical_cast exception. Thus forcing a loop */ }
    }
    while(!inputGood);   // Force user to do input again if there was an error.

}
intmain()
{
bool inputGood=假;
做
{
尝试
{
std::字符串行;
std::getline(std::cin,line);//读取用户行(丢弃“\n”)
intx=boost::词法转换(行);
inputGood=true;//如果我们到了这里,那么词法转换就起作用了。
}
catch(…){/*抛出词法转换异常。从而强制循环*/}
}
while(!inputGood);//如果出现错误,则强制用户重新输入。
}
方法get()最多读取“\n”字符,但不提取它

因此,如果您键入:
122345

这一行:

cin.get(s1,19);
将读取
12345
,但“\n”(通过点击创建)保留在输入流上。因此,下一行将读取:

cin.get(s2,9);
当它看到“\n”并停止时,将不读取任何内容。但它也不会提取“\n”。因此输入流仍然有“\n”。因此此行:

getch();
只需从输入流中读取“\n”字符。这将允许它完成处理并正常退出程序

好的。这就是正在发生的事情。但还有更多。您不应该使用get()读取格式化输入。请使用运算符>>将格式化数据读取为正确的类型

int main()
{
    int   x;
    std::cin >> x; // Reads a number into x
                   // error if the input stream does not contain a number.
}
由于std::cin是一个缓冲流,因此在推送和刷新流之前,数据不会发送到程序。因此,一次读取一行文本(来自用户输入),然后独立解析该行通常很有用。这允许您检查最后一次用户输入的错误(逐行打印,如果有错误,则拒绝)

如果你想获得高级,你也可以看看Boost LIBS。它们一般提供一些不错的代码,作为C++程序,你应该知道Boost的内容。但是我们可以把上面写的为:

int main()
{
    bool inputGood = false;
    do
    {
        try
        {
           std::string  line;
           std::getline(std::cin, line);   // Read a user line (throws away the '\n')

           int  x    = boost::lexical_cast<int>(line);
           inputGood = true;               // If we get here then lexical_cast worked.
        }
        catch(...) { /* Throw away the lexical_cast exception. Thus forcing a loop */ }
    }
    while(!inputGood);   // Force user to do input again if there was an error.

}
intmain()
{
bool inputGood=假;
做
{
尝试
{
std::字符串行;
std::getline(std::cin,line);//读取用户行(丢弃“\n”)
intx=boost::词法转换(行);
inputGood=true;//如果我们到了这里,那么词法转换就起作用了。
}
catch(…){/*抛出词法转换异常。从而强制循环*/}
}
while(!inputGood);//如果出现错误,则强制用户重新输入。
}

您需要使用
cin.ignore();
在获取下一个输入之前忽略流中的换行符。

您需要使用
cin.ignore();
在获取下一个输入之前忽略流中的换行符。

您的意思是“它正在跳出程序”你的意思是,你没有输入OPN S1和S2的东西吗?为什么你会使用微软的优先权,C++的邪恶扩展,比如<代码>”StdAfx.h“< /C>”和?当它在这一行cin.get(s2,9)中得到s2时,它会跳出来;我使用的是vs2008,它确实编译,很抱歉getch()这是一个错误,你是说“专有的”“Ryanli?为什么这个人不使用这些东西?正如你所知,这个人只是学习C++。IDE把这些东西放在新的C++程序中,为什么初学者会问它?如果你不喜欢它,向微软抱怨,而不是马克西姆。你是说“它跳出了程序”。你的意思是,你没有输入OPN S1和S2的东西吗?为什么你会使用微软的优先权,C++的邪恶扩展,比如<代码>”StdAfx.h“< /C>”和?当它在这一行cin.get(s2,9)中得到s2时,它会跳出来;我使用的是vs2008,它确实编译,很抱歉getch()这是一个错误,你是说“专有的”“Ryanli?为什么这个人不使用这些东西?正如你所知,这个人只是学习C++。IDE把这些东西放在新的C++程序中,为什么初学者会问它?如果你不喜欢它,向微软抱怨,而不是马克西姆。”马克西姆,“戴维18:不要这么做。你正在对一个数字进行真正的解析。(特别是当用户没有键入数字时)。您应该使用运算符>>来读取number@maxim,@Dave18:不要这样做。你正在使数字的解析变得非常困难(特别是当