【cin的问题】
我们通常使用 cin 来做输入接收,但是使用cin在接收字符串的时候有一个问题:它不能接受带有空格的字符串。因为遇到空格,cin认为输入结束。
#include <iostream>
using namespace std;
#define N 100
int main()
{
char a[N];
cin>>a;
cout<<a;
}
如果,此时你输入字符串"hello world!"
输出结果为:"hello"
【gets函数的缺陷】
1)gets函数,以输入回车作为结束,所以能够解决上述问题。
2)它是C语言中的字符串接收函数,应包含头文件#include <stdio.h>,在#include <iostream>中也能直接使用。
3)但是它有一个缺陷:gets()不安全是因为你给了他一个缓冲区,但是你却没有告诉它这个缓冲区到底有多大,也不知道输入的内容到底有多大,输入的内容可能超出缓冲区的结尾,引起你的程序崩溃。
#include <iostream>
using namespace std;
#define N 100
int main()
{
char a[N];
gets(a); //使用gets()函数接收字符串
cout<<a;
return 0;
}
你会看到有一个告警:
warning: this program uses gets(), which is unsafe.
【fgets函数】
fgets函数用来从文件中读入字符串,它可以解决gets函数的缺陷。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。不是很常用,这里暂不做讨论。
【getline函数】
getline函数可以完美解决带空格的字符串输入问题,简明、便捷,使用较为普遍
第一种使用方法:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string str;
cout<<"please input a character string: ";
//从cin读入,赋值到str,以换行符作为结束标志,,第三个参数可以不用写,默认是'\n'
getline(cin,str,'\n');
return 0;
}
注意:getline第二个参数不可以为char数组,也就是是说,getline只可以赋值给string类。
第二种使用方法:
#include <iostream>
using namespace std;
#define N 100
int main()
{
char a[N];
cin.getline(a,N,'\n'); //第三个参数可以省略,系统默认为'\0'
cout<<a;
}
1)cin.getline()函数的三个参数分别是:缓冲区指针,最大接收长度(包括字符串结束标志'\0'),输入结束标志
2)cin.getline第二个参数不可以为string类的对象,只能为字符指针(char *)
报名我的信息学竞赛课(C++基础课程、NOIP算法课程、市赛、区赛集训课程),可以加微信?????联系我,注明“姓名+CSDN 课程咨询”~