C++基础学习系列-1-字符串的读取和显示

本文详细解析了C++中cin、cout与get在处理键盘输入时的区别与用法,包括字符串边界判断、空格处理、行输入读取以及输入溢出等问题,提供解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

对于c++,在对键盘输入的字符串进行显示时候,需要注意cin、cout和get等的使用不同上。

1、cin是的输入判断是空格。cin遇“空格”、“TAB”、“回车”都结束的。
以下面为例:
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];

    cout<<"Enter yout name:\n";
    cin>>name;
    cout<<"Enter your favorite dessert:\n";
    cin>>dessert;
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
    return 0;
	system("pause");
}
输入名字: Nil  king
会发现其直接显示最后的结果,直接跳过了输入"Enter your favorite dessert:"阶段。这是因为,cin将Nil king之间的空格判断为截止符号,分配的时候,将Nil分配给 name,将king分配给了dessert。

注意:键盘是无法输入“空字符”,cin使用空白(空格、制表符和换行符)来定字符串的界。这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
cin把Nil作为第一个字符串,并将它放到name数组中,这把king留在输入队列中。当cin在输入队列中搜索用户喜欢的甜点时,它发现了队列中的king,因此cin读取king,并将它放到dessert数组中。
另一种方法是进行以行为单位进行读取,使用的是get和getline。两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中
依旧看下例子:
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];

    cout<<"Enter yout name:\n";
	cin.get(name,7);//读取整行,注意,此处在指定读取字符数的时候不能使用ArSize这样的变量
	//cin.get(name,size)若是所设置的字符数参数小于实际输入的参数时,
	//cin.getline(name,7);
	 /*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
	如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
    cout<<"Enter your favorite dessert:\n";
    cin>>dessert;
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
    return 0;
	system("pause");
}

从该结果可以看出,用cin.get所指定的是读取7个字符,但是输入的liu jie共7个字符,但是所读取的只有liu ji共六个字符。这是因为需要预留一个与结尾添加空字符('\0')。字符'e'被存储在desset中。

对于getline()将丢弃换行符,而get()将换行符保留在输入序列中。采用以下代码进行测试:
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];
	char d[ArSize];
	
    cout<<"Enter yout name:\n";
	cin.get(name,7);//
	
	//cin.getline(name,7);
	 /*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
	如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
    cout<<"Enter your favorite dessert:\n";
	//cin.get();
    cin.getline(dessert,7);
	//cin.getline(dessert,20);
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
	
    return 0;
	system("pause");
}
其结果如下图:

从该结果可以看出,直接跳过了cin.getline(dessert,7)这条语句。若是将两者顺序对换以下呢,即输入name的时候采用getline,而dessert的时候采用getline。
cin.getline(name,7);和 cin.get(dessert,7);
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];
	char d[ArSize];
	
    cout<<"Enter yout name:\n";
	cin.getline(name,7);//
    cout<<"Enter your favorite dessert:\n";
	//cin.get();
    cin.get(dessert,7);
	//cin.getline(dessert,20);
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
	//可能是由于getline丢弃了换行符
    return 0;
	system("pause");
}
其结果如下图所示:

分析:
这是因为get(name,7)的时候,保留了换行符,即换行符留在了队列中,第二次调用时【getline()和get()】,看到的第一个字符便是换行符,认为已经达到行尾,而没有发现任何可读取的内容。getline(name,7)的时候,舍弃了换行符。
如果不借助于帮助,get()或是getline()将不能跨过该换行符。
所以,若要第二次使用get(name,7)来操作,需要先使用不带参数的cin.get()来处理换行符。不带任何参数的cin.get()调用读取下一个字符(即使是换行符)的变体。因此可以用它来处理换行符,为读取下一行输入做好准备。
其代码测试如下:
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];
	char d[ArSize];
	
    cout<<"Enter yout name:\n";
	cin.get(name,7);//
	
	cout<<"Enter your favorite dessert:\n";
	cin.get();
    cin.getline(dessert,7);
	//cin.getline(dessert,20);
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
	
    return 0;
}
其测试结果:

另一种使用get()的方式是将两个类成员函数拼接起来(合并),如下所示
      cin.get(name, ArSize).get();  //将两个类成员函数合并
      cin.get(name, ArSize)//返回一个cin对象,该对象随后将被用来调用get()函数。
      注意:有些C++的老版本没有实现不接受任何参数的get()变体,但实现了接受一个char参数的get()变体。要使用该变体(而不是没有参数get()),需要首先声明一个char变量:
      char ch;
      cin.get(name, ArSize).get(ch);

对于cin.getline进行类似的分析。以下面为例
int main()
{
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];

    cout<<"Enter yout name:\n";
	cin.getline(name,7);//读取整行,注意,此处在指定读取字符数的时候不能使用ArSize这样的变量
	//cin.get(name,size)若是所设置的字符数参数小于实际输入的参数时,
	//cin.getline(name,7);
	 /*第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
	如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。*/
    cout<<"Enter your favorite dessert:\n";
    cin>>dessert;
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
    return 0;
	system("pause");
}
其输出的结果:

通过与上一张图对比,发现“e”并没有存储到dessert这个数组中。
这是因为上述代码中的输入是7个字符,而name数组仅仅可以接收6个字符。这就发生了溢出
若将其输入改为 liu ji,则可以输入dessert。其结果如下图:

这说明cin.getline的溢出,在一定程度上可以视为错误,从键盘输入溢出的部分并没有存储在dessert中。会直接跳过cin>>dessert,采用cin.getline也是会被跳过的,设置失效位,并关闭后面的输入。在溢出的情况下,不可输入!那怎么使得,溢出不对输入产生影响呢?可以采取cin.clear()命令恢复输入。
测试代码如下:
#include <iostream>
#include <string>
using namespace std;

int main()
{
	
	const int ArSize=20;
    char name[ArSize];
    char dessert[ArSize];

    cout<<"Enter yout name:\n";
	cin.getline(name,7);
	cin.clear();
    cout<<"Enter your favorite dessert:\n";
    cin.get(dessert,20);
    cout<<"I have some delicious "<<dessert;
    cout<<" for you."<<name<<endl;
    return 0;
	

}
结果图:

实现可输入的恢复!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值