C++中的字符串输入

图片来自书籍《C++ primer plus》

字符串输入

常规是使用cin,但cin有缺陷;1.cin 使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着 cin 在获取字符数组如果有空格时那么在输入时只读取一个单词。读取该单词后,cin 将该字符串放到数组中,并自动在结尾添加空字符。

2.输入字符串可能比目标数组长,这样一样会出现问题。



所以应该每次读取一行字符串输入

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


(1) 面向行的输入:cin.getline(name,size),只能用于字符数组的输入

getline( )函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。

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





它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符(参见图 4.5)。

在这里插入图片描述

#include<iostream>
using namespace std;

int main(){
    char c1[20];//C语言风格字符串
    cout << "请输入一串字符串(注意不要超过19个字符):";
	cin.getline(c1, 20);
	cout << c1 << endl;
return 0;

}

在这里插入图片描述





(2) 面向行的输入:cin.get(name,size),只能用于字符数组的输入

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




如果我们连续两次调用get()
cin.get(name1,size1);
cin.get(name2,size2);
出现问题:无法输入第二个字符串

在这里插入图片描述

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此 get( )认为已到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get( )将不能跨过该换行符。




所以如果要使用cin.get(),都应该像下面这样使用。一定要牢记!!!

cin.get(name1,size1).get(); // 拼接方式
cin.get(name2,size2).get();…以此类推
或者
cin.get(name1,size1);
cin.get();
cn.get(name2,size2);
cin.get();
原则就是每次输入完后都要加一个cin.get();cin.get()的作用:读取一个字符

#include<iostream>
using namespace std;

int main(){
    char c1[20];
    char c2[20];//C语言风格字符串
   	cout << "请输入一串字符串(注意不要超过19个字符):";
	cin.get(c1, 20).get();
	cout << c1 << endl;
	cout << "请再输入一串字符串(注意不要超过19个字符):";
	cin.get(c2, 20).get();
	cout << c2 << endl;
return 0;
}

在这里插入图片描述



总之,getline( )使用起来简单一些,但 get( )使得检查错误更简单些。可以用其中的任何一个来读取一行输入;只是应该知道,它们的行为稍有不同。





(3) 空行和其它问题

空行和输入大于分配,getline和get都会退出(或者说关闭)输入,然后执行剩下的语句。



(4) 混合输入字符串和数字,和连续两次调用cin.get()问题一样。解决方法都是多加一个cin.get();

在这里插入图片描述
用户根本没有输入地址的机会。问题在于,当 cin 读取年份,和cin.get()一样会将回车键生成的换行符留在了输入队列中。后面的 cin.getline( )(就算用cin.get()也是一样的问题)看到换行符后,将认为是一个空行,并将一个空字符串赋给 address 数组。解决之道是,在读取地址之前先读取并丢弃换行符。这可以通过几种方法来完成,其中包括使用没有参数的 get( )和使用接受一个 char 参数的 get( ),如前面的例子所示。可以单独进行调用:

在这里插入图片描述
所以在使用cin>>这种方法输入时(无论是不是混合输入),都建议是像cin.get()那样加一个cin.get();

#include<iostream>
using namespace std;

int main(){
    int num;
	char c1[20];//C语言风格字符串
	char c2[20];

    cout << "请输入一个数字:";
	(cin >> num).get();
	cout << num << endl;
	cout << "请输入一串字符串(注意不要超过19个字符):";
	cin.get(c1, 20).get();
	cout << c1 << endl;
	cout << "请再输入一串字符串(注意不要超过19个字符):";
	cin.get(c2, 20).get();
	cout << c2 << endl;

return 0;
}

在这里插入图片描述





(5)针对string字符串的输入:getline(),包含string头文件

语法:getline(cin,字符串名);

#include<iostream>
using namespace std;
#include<string>

int main(){

string str;
cout<<"请输入一串字符串:";
getline(cin,str);
cout<<str<<endl;
return 0;
}

在这里插入图片描述





注意

  1. cin.get()、cin.getline()都是针对字符串输入的,而且可以输入的最大字符数是数组下标-1,要留一个空给换行符。
  2. 如果要输入数字的话,常规cin>>就行。但是要特别注意混合输入的问题。

示例:

#include<iostream>
using namespace std;
#include<string>



int main(){

 int num;
 char c1[20];//C语言风格字符串
 char c2[20];
string str;// C++风格字符串 


cout<<"请输入一个数字:";
(cin>>num).get();
cout<<num<<endl;
cout<<"请输入一串字符串(注意不要超过19个字符):";
cin.get(c1,20).get();
cout<<c1<<endl;
cout<<"请再输入一串字符串(注意不要超过19个字符):";
cin.getline(c2,20);
cout<<c2<<endl;

cout<<"请输入一串任意长度的字符串:";
getline(cin,str);
cout<<str<<endl;



return 0;
}


在这里插入图片描述

  • 25
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值