C++读取字符串 cin、getline()、get() 等输入可能遇到的问题和解决办法

 

1.字符串输入

问题:cin如何确定我们完成了字符串的输入呢?

答:cin会使用空白(空格、制表符、换行符)来确定字符串的结束位置,

这就意味着cin在获取字符数组输入时,只读取一个单词,将该字符串放入数组中,并自动在末尾添加空字符。

如 :

cout<<"Enter your name:\n";
cin>>name;
cout<<"Enter your favorite fruit:\n";
cin>>fruit;
cout<<"I have some "<<fruit<<"for you,"<<name<<".\n";

当我们在输入名字,如 Taylor Swift 时,我们便失去了输入水果的机会,系统会直接输出

I have some Swift for you,Taylor.

那么我们如何来读取一个完整的字符串呢?

 

2.每次读取一行字符串输入

istream类中提供了一些面向行的类成员函数:getline() 和 get()

这两个函数都读取一行输入,直到到达换行符。然而,getline() 将丢弃换行符,而 get() 将换行符保留在输入序列中。

  • getline()

getline() 函数读取整行,通过回车键输入的换行符来确定输入结尾。

要调用这种方法,可以使用cin.getline()。

该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。(若该参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾添加的空字符)

getline() 在读取指定数目的字符或遇到换行符时停止读取。

如:(把一行读入到name数组中,当这行包含字符不超过19个时)

cin.getline(name,20);
  • get()

与getline() 类似,但get并不再读取并丢弃换行符,而是将其保留。

使用 get() 可能会出现下面的问题

cin.get(name,20);
cin.get(fruit,20); //无法执行

原因在于,第一次调用get()后,换行符保留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。

因此 get() 认为已经到达行尾,而没有发现任何可读取的内容。

那么我们可以用不带任何参数的  cin.get() 调用可读取下一个字符(即使是换行符)。也就是说可执行:

cin.get(name,20);
cin.get();        //读取换行符
cin.get(fruit,20);

另一种方式是,将两个类成员函数拼接起来,如下:

cin.get(name,20).get();

之所以可以这样做是因为 cin.get(name,20) 返回一个cin对象,该对象随后将被用来调用get()函数。

同样,下面的语句将把输入中的连续两行分别读入到数组name1 和name2中,效果与两次调用cin.getline()相同。

cin.getline(name1,20).getline(name2,20);

编程中往往使用 get() 比较多,原因是 get()输入可以知道停止读取的原因是 由于已经读取了整行,还是 由于数组已经填满.。

我们可以查看下一个输入字符,若是换行符,则说明已经读取了整行,否则,说明该行中还有其他输入。

总之,getline() 使用起来更简单,但 get() 使得我们检查错误更简单。


3. 当 getline() 或 get() 读取空行时会出现什么情况呢?

举个例子:

cout<<" what year was your house built?\n";
cin>>year;
cout<<" what is its street address?\n"
cin.getline(address,80);

当我们运行该程序时会发现,我们根本没有输入地址的机会。

这是因为cin 在读取年份时,将回车键生成的换行符留在了输入队列中,后面的cin.getline()看到换行符,认为是一个空行,

并将该空字符串赋给address数组。

解决办法:

cout<<" what year was your house built?\n";
cin>>year;
cin.get();
cout<<" what is its street address?\n"
cin.getline(address,80);

或( cin>>year ).get();

 

总结:

在我们编程时,遇到输入被阻断的问题,就要查看cin在读取输入字符串时是否遇到了 换行、空行,我们就需要采取相应的措施来解决。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章