一、简述
这几天开始学的时候,一直对 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();
四、总结:
*****仅限于我目前学到的知识,之后加以补充
-
cin
① cin>> 右面是一个字符时,从缓冲区读取一个非空白字符的字符后停止读取。
② cin>> 右面是一个字符串时,从缓冲区读取数据,若第一个字符为空白字符,则忽略并丢弃,读取下一个字符,直到遇到空白字符时停止读取,此空白符留在缓冲区。 -
cin.get()
① 无参数时,读入一个字符,包括换行符,常用来处理输入缓冲区中的换行符。
② 接受一个参数时,格式为cin.get(char ch);
,读入一个字符后结束读取。
③ 接受两个参数时,格式为cin.get(array_name, ArSize);
,从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过规定的字符数不会出现错误,会直接截断,cin.get() 不对此换行符进行处理,并将其留在缓冲区。 -
cin.getline()
接受两个参数,格式为cin.getline(array_name, ArSize);
,函数从缓冲区读取数据,达到行尾或者读取了 ArSize - 1 个字符为止,且超过所规定的字符数会出现错误,cin.getline() 读取换行符后将其替换为空字符,并丢弃。 -
getline()
声明在头文件<string>
中
接受两个参数,格式为getline(cin, string_name);
,从缓冲区读取数据,遇到换行符时结束读取,且 getline() 读取此换行符后将其替换为空字符,并丢弃。