我刚开始学习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 : ";
cin.get(s2,9);
cout<<s1<<"/n"<<s2;
getch();
}
答案 0 :(得分:6)
方法get()读取'\ n'字符,但不提取它。
因此,如果您输入:122345<enter>
这一行:
cin.get(s1,19);
将阅读12345
,但'\ n'(由hitting&lt; enter&gt;创建)将保留在输入流中。因此,下一行是:
cin.get(s2,9);
当它看到'\ n'并停止时,它将不会读取任何内容。但它也没有提取'\ n'。所以输入流仍然有'\ n'。所以这一行:
getch();
只需从输入流中读取'\ n'字符即可。然后,它允许它完成处理并正常退出程序。
行。这就是发生的事情。但还有更多。您不应该使用get()来读取格式化的输入。使用运算符&gt;&gt;将格式化数据读入正确的类型。
int main()
{
int x;
std::cin >> x; // Reads a number into x
// error if the input stream does not contain a number.
}
因为std :: cin是缓冲流,所以在推入&lt; enter&gt;之前,数据不会发送到程序。并且流被刷新。因此,一次读取一行(通过用户输入)然后独立解析该行通常很有用。这允许您检查最后一个用户输入是否有错误(逐行显示,如果有错误则拒绝)。
int main()
{
bool inputGood = false;
do
{
std::string line;
std::getline(std::cin, line); // Read a user line (throws away the '\n')
std::stringstream data(line);
int x;
data >> x; // Reads an integer from your line.
// If the input is not a number then data is set
// into error mode (note the std::cin as in example
// one above).
inputGood = data.good();
}
while(!inputGood); // Force user to do input again if there was an error.
}
如果你想要先进,那么你也可以查看升压库。它们提供了一些很好的代码,作为一个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.
}
答案 1 :(得分:1)
在下次输入之前,您需要使用cin.ignore();
忽略流中的换行符。