cin, cin.get(), cin.getline(), getline()的区别(直接看总结)

一、简述

这几天开始学的时候,一直对 cin,cin.get(),cin.getline(),getline() 这四种输入迷迷糊糊的,很容易混淆,敲代码时总会犯一些错,使得代码的运行结果并不使人满意,所以做完这一题后,我准备做一次简单总结,来使自己正确掌握目前所学到的这四种输入方法。

二、题目:

/*
	设计一个名为 car 的结构,用它存储下述有关汽车的信息:
	生产商(存储在字符数组或 string 对象中的字符串)、生产年份(整数)。
	编写一个程序,向用户询问有多少辆汽车。
	随后,程序使用 new 来创建一个由相应数量的 car 结构组成的动态数组。
	接下来,程序提示用户输入每辆车的生产商(可能由多个单词组成)和年份信息。
	请注意,这需要特别小心,因为它将交替读取数值和字符串。
	最后,程序将显示每个结构的内容。
	该程序运行情况如下:

	How many cars do you wish to catalog? 2
	Car #1:
	Please enter the make: Hudson Hornet
	Please enter the year made: 1952
	Car #2:
	Please enter the make: Kaiser
	Please enter the year made: 1951
	Here is your collection:
	1952 Hudson Hornet
	1951 Kaiser
*/

三、代码

1.不符合要求的代码:

#include<iostream>
#include<string>

using namespace std;

int main()
{
	//定义一个汽车的结构
	struct car
	{
		string manufacturer;        //生产商
		int year;        //年份
	};

	int num;         //汽车的数量
	cout << "How many cars do you wish to catalog? ";
	cin >> num;        //用户输入汽车的数量
	car * information = new car[num];        //用 new 创建一个 car 结构的动态数组

	//通过用户输入数量,动态创建表示汽车信息的数组
	for (int i = 0; i < num; i++)
	{
		cout << "Car #" << i + 1 << ": \n";
		cout << "Please enter the maker: ";
		getline(cin, information[i].manufacturer);   //用户输入这辆汽车的生产商(不给用户输入生产商的机会)
		cout << "Please enter the year made: ";
		cin >> information[i].year;          //用户输入这辆汽车的年份
	}

	cout << "Here is your collection:\n";
	//循环输出之前所输入的各汽车信息
	for (int i = 0; i < num; i++)
	{
		cout << information[i].year << " ";        //年份
		cout << information[i].manufacturer << "\n";       //生产商
	}
	delete[] information;         //释放 new 建立的内存

	return 0;
}

问题:用户没有输入汽车生产商的机会,怎样才能输入?

2.正确示例:

#include<iostream>
#include<string>

using namespace std;

//定义一个 car 结构
struct car
{
	string manufacturer;        //生产商
	int year;        //年份
};

int main()
{
	int num;         //汽车的数量
	cout << "How many cars do you wish to catalog? ";
	cin >> num;        //用户输入汽车的数量
	cin.get();
	car * information = new car[num];        //用 new 创建一个 car 结构的动态数组

	//通过用户输入数量,动态创建表示汽车信息的数组
	for (int i = 0; i < num; i++)
	{
		cout << "Car #" << i + 1 << ": \n";
		cout << "Please enter the maker: ";
		getline(cin, information[i].manufacturer);    //用户输入这辆汽车的生产商
		cout << "Please enter the year made: ";
		cin >> information[i].year;          //用户输入这辆汽车的年份
		cin.get();
	}

	cout << "Here is your collection:\n";

	//循环输出之前所输入的各汽车信息
	for (int i = 0; i < num; i++)
	{
		cout << information[i].year << " ";        //年份
		cout << information[i].manufacturer << "\n";       //生产商
	}
	delete[] information;         //释放 new 建立的内存

	return 0;
}

解决办法:在 getline() 上一个 cin 输入之后添加 cin.get();

四、总结:

*****仅限于我目前学到的知识,之后加以补充

  1. cin
    ① cin>> 右面是一个字符时,从缓冲区读取一个非空白字符的字符后停止读取。
    ② cin>> 右面是一个字符串时,从缓冲区读取数据,若第一个字符为空白字符,则忽略并丢弃,读取下一个字符,直到遇到空白字符时停止读取,此空白符留在缓冲区

  2. cin.get()
    ① 无参数时,读入一个字符,包括换行符,常用来处理输入缓冲区中的换行符。
    ② 接受一个参数时,格式为 cin.get(char ch);,读入一个字符后结束读取。
    ③ 接受两个参数时,格式为 cin.get(array_name, ArSize);,从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过规定的字符数不会出现错误,会直接截断,cin.get() 不对此换行符进行处理,并将其留在缓冲区

  3. cin.getline()
    接受两个参数,格式为 cin.getline(array_name, ArSize);,函数从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过所规定的字符数会出现错误,cin.getline() 读取换行符后将其替换为空字符,并丢弃

  4. getline()
    声明在头文件<string>
    接受两个参数,格式为 getline(cin, string_name);,从缓冲区读取数据,遇到换行符时结束读取,且 getline() 读取此换行符后将其替换为空字符,并丢弃

  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

粉红橘红橘粉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值