前文:
在c++11标准及之前,仍可以使用gets
读入,但是c++14正式删除了gets
这一不安全的读入。由于读入对空格的自动忽略,所以需要其他读入函数来处理带空格的字符串。
具体读入方式:
一、字符数组
A、std::cin.getline(str, size)
#include<iostream>
int main() {
char str[100];
std::cin.getline(str, 100);
std::cout << str << "\n";
return 0;
}
表示你可以从索引
0
0
0开始读入至多
99
99
99个字符,最后一个留给'\0'
getline
遇到换行后,会停止继续读入并且过滤掉换行。
B、std::cin.get(str, size)
#include<iostream>
int main() {
char str[100];
std::cin.get(str, 100);
std::cout << str << "\n";
return 0;
}
注意:
cin.get()
与cin.get(str, size)
cin.get()
可以读入任何字符
cin.get(str, size)
不能过滤换行,即遇到换行符就结束读入,并且换行符仍然会丢在缓冲区。
如下程序一个停留在缓冲区的换行符将会使得下面的所有get
读入都失效。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s1[10], s2[10], s3[10];
cin.get(s1, 10);
cin.get(s2, 10);
cin.get(s3, 10);
cout << strlen(s1) << " : "<< s1 << "\n";
cout << strlen(s2) << " : "<< s2 << "\n";
cout << strlen(s3) << " : "<< s3 << "\n";
return 0;
}
输出:
100
3 : 100
0 :
0 :
解决办法:在get
读入完成后再用一次get
将换行手动过滤掉:
cin.get(str, 100).get();
C、scanf("%[^\n]", str)
与get
类似,也不会过滤换行:具体操作如下。
#include<cstdio>
int main()
{
char str[100];
scanf("%[^\n]", str); getchar();
printf("%s\n", str);
return 0;
}
为了保证不出类似的错误,建议所有的scanf
后都跟一个getchar
过滤换行符。
D、fgets(str, size, stdin)
为了解决gets
的读入安全问题,fgets
中添加了读入的最长长度size
,不过fgets
会读入换行符。如下:
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char str[10];
fgets(str, 10, stdin);
for(int i = 0; i < strlen(str); ++i) {
if(str[i] == '\n') printf("x");
else printf("%c", str[i]);
}
return 0;
}
运行结果:
input:
123
output:
123x
所以如果不需要的换行符时可以str[strlen(str)-1]='\0'
将换行符去除。
二、string
类
A、getline(std::cin, s)
#include<iostream>
#include<string>
int main()
{
std::string s;
getline(std::cin, s);
std::cout << s << "\n";
return 0;
}