我们知道C/C++ 语言直接用scanf 和cin 会跳过空格的读取,如果一个字符串中含有未知数量空格的话读取起来就比较费劲,下面总结了几个读入空格的方式。
1.gets():
对象为char数组。
这种用法在C++ 11以后就被移除了。 原因:该方法不会对输入数据进行长度检查,它会一直读取输入数据直到遇到换行符或文件结束符,如果输入的数据长度超过了目标缓冲区的大小,就会导致缓冲区溢出,可能覆盖其他内存区域,引发安全漏洞。
char c[100];
gets(c);
puts(c)
2.getline()
作为对于gets()的替代,可以读取一整行字符。
用法一:getline 针对string类型
/*
getline(输入流,字符串,终止字符) 终止字符不写时默认为 '\n'。
*/
string a;
getline(cin,a);
cout<<a;
用法二:cin.getline 针对char数组类型
/*
cin.getline(字符串,读取长度n,终止字符) 读入的实际长度为n-1, 终止字符不写时默认为 '\n'。
与之类似的还有cin.get 同样针对的是char数组
cin.get(字符串,读取长度n) 读入的实际长度为n-1。
*/
char a[100];
cin.getline(a,100);
cout<<a;
3.get_s()
对象为char数组。
由于gets_s是Visual Studio 编译器提供的安全gets函数(用于gets解决长度溢出),因此仅在该编译器环境底下可以使用。
/*
gets_s(字符串,读取长度n) 读入的实际长度为n-1。
*/
char a[100];
gets_s(a,10);
cout<<a;
4.scanf()
对象为char数组
char str[50];
scanf("%[^\n]",str);
printf("%s",str);
5.getchar()
getchar 用于读取任意的单个字符(可以读取空格和回车)非常灵活。
char c;
c=getchar();
cout<<c;
输入的字符串按空格分隔
1.流形式处理
//需加入头文件sstream
vector<string> a;
string line;
getline(cin,line);
//将带有空格的字符串line 转化为字符
istringstream l(line);
string t;
while(l>>t)
{
a.push_back(t);
}
for(auto p:a)
{
cout<<p;
}
2.单个字符处理
//i 用于遍历输入的所有字符串
//j 用于遍历字符串a
int i=0;
char *fh=new char[10];
//将输入的第一行字符串处理
while(1)
{
//输入字符
char c=getchar();
//输入回车,结束循环
if(c=='\n')
{
//添加终止符
fh[i]=0;
i=0;
//字符串复制到a里
strcpy(a[j++],fh);
break;
}
//输入空格 则前面数据为一个完整单词
else if(c==' ')
{
//添加终止符
fh[i]=0;
i=0;
//字符串复制到a里
strcpy(a[j++],fh);
continue;
}
else
{
fh[i++]=c;
}
}
3.stroke处理
char s[20] = "a b c d e f";
char* p = strtok(s, " ");
vector<string> words;
while(p) {
words.push_back(p);
//因为传入的参数为NULL 默认使用上一轮未
p = strtok(NULL, " ");
}