字符串的输入问题 C++

   C++中,初学时最常用的输入字符的方式为cin,但是,cin是如何确定已经完成了字符串的输入了呢?由于不能通过键盘输入空字符("\0"),因此cin需要用别的方法来确定字符串的结尾位置。cin使用空白(空格,制表符和换行符)来确定字符串结束的位置,这意味着cin在取字符数组输入时只能读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。如下的程序所示:

#include<iostream>
using namespace std;
int main()
{   
    const int size = 20;
    char  name[size];
    char desert[size];
    cout << "请输入你的名字:\n";
    cin >> name;
    cin.get();
    cout << "请输入你最喜欢的甜食:\n";
    cin >> desert;
    cin.get();
    cout << "I have some delicious " << desert << " for you," << " . \n";
    cin.get();
    return 0;
}

程序运行结果:

  请输入你的名字:
  xiao ming
  请输入你最喜欢的甜食:
  I have some delicious ming for you, .

  你看,上图中的运行程序,我还没有对我最喜欢的甜食输入呢,程序就迫不及待的显示了下面的内容。这是因为:cin把xiao作为了第一个字符串,并把它放入了name数组中,把ming这个字符串留在了输入队列中。当cin在输入队列中搜索用户喜欢的甜点时,它发现了ming,因此它读取ming,并把它放入了dessert数组中。

  那么,如何输入一行的字符串呢?

一、面向行的输入:getline()与get()

1. getline()

  getline()函数用于读取整行,它使用通过回车键键入的换行符来确定输入结尾。该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如下面的代码所示就能避免只读取一个单词的错误:

#include<iostream>
using namespace std;
int main()
{   
    const int size = 20;
    char  name[size];
    char dessert[size];
    cout << "请输入你的名字:\n";
    cin.getline(name, size);
    cout << "请输入你最喜欢的甜食:\n";
    cin.getline(dessert, size);
    cout << "I have some delicious " << dessert << " for you.\n" ;
    cin.get();
    return 0;
}

程序运行结果:

请输入你的名字:
xiao ming
请输入你最喜欢的甜食:
ice cream
I have some delicious ice cream for you.

getline()函数每次读取一行,它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,他用空字符来替换换行符。

2.get()

get的用法和getline()函数一样。但是,get()函数会保存换行符。先看个例子:

cin.get(name,size);

cin.get(name,size);

  就是连续调用了两次get(),由于第一次调用后,换行符将保留在输入队列中,因此,第二次调用时看到的第一个字符便是换行符,因此get()认为以到达结尾,而没有发现任何可读取的内容。

  那么,如何解决这种问题呢?有以下两种方式:

(1)                              

cin.get(name,size);

cin.get(); // 使用不带任何参数的get()可读取下一个字符(即使是换行符),因此,可通过它来处理换行符,为读取下一行输 入做好准备

cin.get(name,size);

(2)cin.get(name,size).get()

程序如下所示:

#include<iostream>
using namespace std;
int main()
{   
    const int size = 20;
    char  name[size];
    char dessert[size];
    cout << "请输入你的名字:\n";
    cin.get(name, size).get();
    cout << "请输入你最喜欢的甜食:\n";
    cin.get(dessert, size).get();
    cout << "I have some delicious " << dessert << " for you.\n" ;
    cin.get();
    return 0;
}

运行结果:

请输入你的名字:
xiao ming
请输入你最喜欢的甜食:
ice cream
I have some delicious ice cream for you.

猜你喜欢

转载自www.cnblogs.com/carlber/p/9862615.html