C++字符串输入(详解)

文章目录

案例

题目描述:
读取用户输入的信息

测试代码:

#include <iostream>
using namespace std;

int main() {
	char name[20];
	char food[20];
	cout << "请输入你的名字:" << endl;
	cin >> name;
	cout << "请输入你最喜欢吃的食物:" << endl;
	cin >> food;
	cout << "你的名字为:" << name<<endl;
	cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
你的名字为:Hello
你最喜欢吃的食物为:World

        我们不难发现,在输入第二项内容时,直接跳过了,输出了最后的结果。这是为什么呢?这是因为,cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后, cin将该字符串放到数组中,并自动在结尾添加空字符。这也就解释了为什么运行结果是那样的,那怎么去修改呢,听我接着讲。

        幸运的是,istream中的类(如 cin)提供了一些面向行的类成员函数: getline()和get( )。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。下面详细介绍它们,首先介绍getline( )。

getline()

       getline( )函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。

语法:

//将姓名读入到一个包含20个元素的name数组中。
cin.getline(name,20);

对一开始的例子进行修改:

#include <iostream>
using namespace std;

int main() {
	char name[20];
	char food[20];
	cout << "请输入你的名字:" << endl;
	cin.getline(name, 20);
	cout << "请输入你最喜欢吃的食物:" << endl;
	cin.getline(food, 20);
	cout << "你的名字为:" << name<<endl;
	cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
banana apple
你的名字为:Hello World
你最喜欢吃的食物为:banana apple

get()

       istream类有另一个名为 get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列中。

  1. 如果采用与getline()一样的方式
#include <iostream>
using namespace std;

int main() {
	char name[20];
	char food[20];
	cout << "请输入你的名字:" << endl;
	cin.get(name, 20);
	cout << "请输入你最喜欢吃的食物:" << endl;
	cin.get(food,20);
	cout << "你的名字为:" << name<<endl;
	cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
你的名字为:Hello World
你最喜欢吃的食物为:

       我们会发现跟前面一样的问题,即还没输入就直接跳过了。为什么呢,由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾,而没有发现任何可读取的内容。get()将不能跨过该换行符。

那怎么办呢,我们可以用不带参数的cin.get()来处理掉该换行符,请看下面代码:

#include <iostream>
using namespace std;

int main() {
	char name[20];
	char food[20];
	cout << "请输入你的名字:" << endl;
	cin.get(name, 20);
	cin.get();//吸收换行符
	cout << "请输入你最喜欢吃的食物:" << endl;
	cin.get(food,20);
	cout << "你的名字为:" << name<<endl;
	cout << "你最喜欢吃的食物为:" << food << endl;
}

运行结果:
请输入你的名字:
Hello World
请输入你最喜欢吃的食物:
apple pear
你的名字为:Hello World
你最喜欢吃的食物为:apple pear

       当getline()或get()读取空行时,将发生什么情况?最初的做法是,下一条输入语句将在前一条getline()或get()结束读取的位置开始读取;但当前的做法是,当get()(不是 getline())读取空行后将设置失效位( failbit)。这意味着接下来的输入将被阻断,但可以用下面的命令来恢复输入:

cin.clear();
  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xw_lover

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值