c++中 gets(s)、scanf(%s) 、getline(s)、cin >> s 比较


类别 gets(s) scanf(%s) getline(s) cin >> s
存储类型 字符数组 字符数组 字符串 字符串或字符数组
接收字符串结束 回车 回车、空格、Tab 回车 回车、空格、Tab
读时在缓冲区留下回车符
是否读取回车符
使用头文件 stdio.h,cstdio stdio.h,cstdio iostream iostream

对于读取不定长的序列整数,一般用gets或getline然后转为整数数组存储;gets容易越界,所以一般用getline。

1.gets和getline读取换行符

//gets读取回车:
string a;
char b[100];
int main()
{
	cin >> a;
	gets(b);
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	return 0;
}


//getline读取回车
string a;
string b;
int main()
{
	cin >> a;
	getline(cin,b);
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	return 0;
}


//scanf(%s)不读取回车符
string a;
char b[100];
int main()
{
	cin >> a;
	scanf("%s",b);
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	return 0;
}


//cin不读取回车
string a;
char b[100];
int main()
{
	cin >> a;
	cin >> b;
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	return 0;
}

2.cin,scanf会在缓冲区留下回车符,而gets和getline则不会(它们读取换行符)

因此,gets和getline存字符串前有时需要使用getchar清除缓冲区中存留的换行;
gets和getline不在缓冲区留下回车符
char a[100];
string b;
char c[100];
int main()
{
	gets(a);
	getline(cin,b);
	gets(c);
	cout << "a:" << a << endl;
	cout << "b:" << b << endl;
	cout << "c:" << c << endl;
	return 0;
}


scanf,cin在缓冲区留下回车符
char a;
char a1[100];
char b;
string b1;
int main()
{
	cin >> a;
	gets(a1);
	scanf("%c",&b);
	getline(cin,b1);
	cout << "a:" << a << endl;
	cout << "a1:" << a1 << endl;
	cout << "b:" << b << endl;
	cout << "b1:" << b1 << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值