举例说明如何在C++中使用cin.ignore()函数

366 阅读2分钟

使用cin.ignore()方法从输入缓冲区中忽略或删除单个或也许多个字母。也许我们需要删除不受欢迎的缓冲区,以便将下一个数据存储在预定的容器中,而不是前面变量的缓存中。例如,我们在输入cin命令后必须提供一个字符数组或字符串。因此,我们必须清空输入缓冲区;否则,前一个变量的缓冲区将被占用。因为前一个元素的缓冲区缺乏保留新鲜数据的空间,所以在最初的输入之后刚刚按下 "Enter "按钮就会忽略容器的下一个输入。让我们从cin.ignore()函数的例子开始,通过终端外壳启动新的C++文件。文件必须通过触摸指令和文件的名称来创建。到目前为止,Ubuntu的 "nano "编辑器已经被用来打开要编辑的文件。

例子1:

在应用nano指令时,ignore.cc文件将在编辑器中被打开。现在是时候开始我们的第一个例子了。首先,我们将看一下没有使用cin.ignore()函数的c++代码。所以,我们已经用两个头库开始了,即vector和iostream。之后就利用了命名空间。main()函数开始时声明了一个整数变量 "num "和大小为100的字符类型数组 "Str",用于存储一些字符串值。cout语句要求用户添加一个整数和一个字符串类型的值。cin语句用于将整数值放入变量 "num",cin.getline()用于获取用户输入的字符串类型的值,将其保存在 "Str "变量中,最多100个字符。接下来的cout语句被利用来打印出用户在shell上输入的整数和字符串值。

#include<iostream>

#include<vector>

using namespace std;

main() {

   int num;

   char Str[100];

   cout << "Please add one Integer and one String value:\n";

   cin >> num;

   cin.getline(Str,100); //take a string

   cout << "Number :" << num << ", String: " << Str << endl;

}

现在,代码已经被编译和执行。用户输入了两个由空格分隔的数值,即整数和字符串。这两个值都已按规定打印出来。

再次执行时,用户增加了一个值并按下了回车键。输出显示一个返回值,而字符串值为空。

在第三次执行时,用户添加了一个字符串值,但没有添加一个整数值。在回报中,输出显示数字为0,字符串为NULL。

让我们通过在cin语句后添加 "cin.ignore() "函数来更新该代码。它需要两个参数。一个是numeric_limits stream size header,用来清除第一个值之后的缓冲区缓存,一个是引人注目的新行,即"/n"。因此,下一个变量 "Str "将在用户进入下一行后获得数值。

#include<iostream>

#include<vector>

using namespace std;

main() {

   int num;

   char Str[100];

   cout << "Please add one Integer and one String value:\n";

   cin >> num;          //clear buffer before taking new line

   cin.ignore(numeric_limits<streamsize>::max(), '\n');

   cin.getline(Str,100); //take a string

   cout << "Number :" << num << ", String: " << Str << endl;

}

一个用户用一个空格添加了两个值。在按下Enter键后,一个用户又添加了一个值。结果,输出显示第一个整数值和下一行添加的字符串值。cin.ignore()会在清除缓冲区缓存后,从下一行取走空格前的第一个值和第二个值。你可以看到,它已经忽略了第一行输入的字符串值 "Ignore"。

例子2:

现在,我们来看看另一个例子。在main()函数之前加入了一些头文件。在一个函数中,while循环继续执行一些语句。三个整数变量被声明,cout语句要求在这些变量中加入输入值。cin语句将输入值保存到变量中,"if "语句用来检查第一个值是否等于0。如果是,它将立即退出程序。否则,程序继续进行。cin.ignore()语句在这里是为了在下一行之前清除缓存,而cout语句将显示输入的值。

#include <iostream>

#include <sstream>

#include <limits>

#include <vector>

#include <fstream>

using namespace std;

int main() {

   while(true) {

      int n1, n2, n3;

      cout << "Please Type Space-separated 3 Numbers: " << endl;

      cin >> n1 >> n2 >> n3;

      if (n1 == 0) exit(EXIT_SUCCESS);

      cin.ignore(numeric_limits<std::streamsize>::max(), '\n');

      cout <<"1st: "<<n1<<" , 2nd:"<<n2<<" , 3rd: "<< n3<<endl;

   }

   return EXIT_SUCCESS;

}

在执行这个代码例子后,用户已经添加了三个值。第一个值不是0,它将显示第1、2、3个。"while "循环再次继续,用户添加0作为第1个整数值。作为回报,程序退出,没有进一步执行。

例子3:

最后一个例子是将用户输入的两个字符类型的变量作为输入。在两行cin.get()取值之间,我们利用了cin.ignore()函数在遇到空格时清除缓冲区缓存。如果用户添加了任何字符串,cin.get()将只取其初始值,cout将显示它,如下代码。

#include <iostream>

#include <sstream>

#include <limits>

#include <vector>

#include <fstream>

using namespace std;

int main() {

      char v1, v2;

      cout << "Type Two words: " << endl;

      v1 = cin.get();

      cin.ignore(numeric_limits<std::streamsize>::max(), ' ');

      v2 = cin.get();

      cout << "Initials of both words are: "<<v1<<v2<<endl;

   return EXIT_SUCCESS;

}

执行后,用户添加了两个词,而cout语句只显示首字母。

结论

所以,这就是关于在C++中使用cin.ignore()函数来清除缓存缓冲区的全部内容。我们使用了空格和下一行字符作为分隔符。所实现的例子是相当容易学习和理解的。