类别 | 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;
}