何时以及为什么我需要在C ++中使用cin.ignore()?

我用C ++编写了一个非常基本的程序,要求用户input一个数字,然后input一个string。 令我惊讶的是,在运行程序时,它从来没有停止要求string。 它只是跳过它。 在对StackOverflow进行一些阅读之后,我发现我需要添加一行说:

cin.ignore(256, '\n'); 

在获取stringinput的行之前。 增加了这个问题,并使程序工作。 我的问题是为什么C ++需要这个cin.ignore()行,我怎么能预测什么时候我需要使用cin.ignore()

这是我写的程序:

 #include <iostream> #include <string> using namespace std; int main() { double num; string mystr; cout << "Please enter a number: " << "\n"; cin >> num; cout << "Your number is: " << num << "\n"; cin.ignore(256, '\n'); // Why do I need this line? cout << "Please enter your name: \n"; getline (cin, mystr); cout << "So your name is " << mystr << "?\n"; cout << "Have a nice day. \n"; } 

忽略名字意味着什么。

它不会“扔掉”不需要的东西,而是忽略指定的字符数量,直到您指定的断点为止。

它适用于input和输出缓冲区。

实质上,对于在执行getline调用之前使用的std::cin语句,因为当用户使用std::cininput某些内容时,它们会按Enter键,并且'\n'字符将进入cin缓冲区。 那么如果你使用getline ,它会得到换行符而不是你想要的string。 所以你做一个std::cin.ignore(1000,'\n') ,这应该清除缓冲区,直到你想要的string。 (1000是放在那里跳过指定的中断点之前的特定数量的字符,在这种情况下,\ n换行符)。

当您想要从inputstream中手动丢弃特定数量的字符时。

一个非常常见的用例就是使用它来安全地忽略换行符,因为cin有时候会留下换行符,您将不得不去查看下一行input。

长话短说,它给你在处理streaminput时的灵活性。

忽略函数用于跳过(丢弃/丢弃)inputstream中的字符。 忽略文件与文件istream相关联。 考虑下面的函数:cin.ignore(120,'/ n'); 该特定function将跳过下一个input字符或跳过字符,直到读取换行符。

你正在考虑这个错误的方式。 每次使用cingetline时,您都在按逻辑步骤思考。 防爆。 首先要求一个号码,然后要求一个名字。 这是思考cin的错误方法。 所以你遇到一个竞争条件,因为你认为每当你要求一个inputstream清晰。

如果你纯粹为了input而编写程序,你会发现问题:

 void main(void) { double num; string mystr; cin >> num; getline(cin, mystr); cout << "num=" << num << ",mystr=\'" << mystr << "\'" << endl; } 

在上面,你在想,“先拿点数”。 所以你input123按回车,你的输出将是num=123,mystr='' 。 这是为什么? 这是因为在stream中有123\n123被parsing为numvariables,而\n仍然在stream中。 阅读文档的getline函数默认情况下,它将在istream查找,直到遇到\n 。 在这个例子中,由于\n在stream中,它看起来像“跳过”它,但它工作正常。

为了上面的工作,你将不得不input123Hello World ,这将正确输出num=123,mystr='Hello World' 。 那么,或者你把一个cin.ignore放在cingetline之间,这样它就可以分解成你期望的逻辑步骤。

这就是为什么你需要ignore命令。 因为你是按照逻辑的步骤而不是以stream的forms来思考的,所以你会遇到竞争状态。

再举一个学校常见的代码示例:

 void main(void) { int age; string firstName; string lastName; cout << "First name: "; cin >> firstName; cout << "Last name: "; cin >> lastName; cout << "Age: "; cin >> age; cout << "Hello " << firstName << " " << lastName << "! You are " << age << " years old!" << endl; } 

以上似乎是合乎逻辑的步骤。 首先要求名字,姓氏,然后是年龄。 所以,如果你做了John ,那么Doe进入,然后进入,应用程序运行每个逻辑步骤。 如果你在“溪stream”中想到这个问题,你可以直接在“First name:”问题上inputJohn Doe 19 ,这个问题也会起作用,并且似乎跳过了剩下的问题。 为了使上述工作按照逻辑步骤进行,您需要ignore问题中每个逻辑中断的剩余stream。

只要记住从“stream”中读取的程序input,而不是逻辑上的步骤。 每次调用cin ,都是从stream中读取的。 如果用户input错误的话,这将创build一个相当麻烦的应用程序。 例如,如果你input了一个cin >> double的字符,程序会产生一个相当奇怪的结果。

在cin >>语句之后,最好在c ++中使用scanf(“%[^ \ n]”,str)而不是cin.ignore()。