在C/C++语言中,如果我们想读入一个带有空格的字符串,我们可以选择gets(str)。但是这种做法有两个局限性:
- str必须为char类型的数组,不能用string str
- 不能使用-std=c++11编译,因为在c11标准中,已经把gets()函数移除了。
那么,什么是c11标准所推荐的读入带有空格字符串的方式呢?
getline(从哪里读入,赋值到哪里去,以什么标志结束读入)
string str
getline(cin,str,'\n')//比如cin::ab c,赋值完后str="ab c"
上面代码的意思就是从cin读入,赋值到str,以换行符作为结束标志,第三个参数可以不用写,因为第三个参数默认是回车。
getline第二个参数不可以为char数组,也就是是说,getline只可以赋值给string类。
我们知道,cin机制是先赋值到缓冲区,然后getline从缓冲区拿去一部分,赋值给str,那么作为结束符的‘\n’现在有三种状态:
- 没被拿出来,一直从缓冲区呆着。
- 被拿出来了,但是没有被使用,而是被丢弃了。
- 被拿出来了,而且被使用了,赋值到str,成为str的一部分。
实验代码:
//Input:abczabc
string str1,str2;
getline(cin,str1,'z');
getline(cin,str2);
cout<<"str1 = "<<str1<<endl;
cout<<"str2 = "<<str2<<endl;
//Output:
str1 = abc
str2 = abc
实验证明,上述猜想2是正确的。
cin.getline(赋值到哪里去,字符串的上限,以什么标志结束读入)
我们发现,这两个函数其实都差不多,只是这个函数多了个字符串的上限,这是什么东东?
我们看个栗子:
Input:abczabc
string str;
cin.getline(str,3,'z')
cout<<"str = "<<str<<endl;
Output:str = ab
我们发现,str只能接受小于字符串的上限的字符个数,本题为3,那么str最多只能接受2个字符,无论到没到结束标志。
cin.getline的第一个参数可以接收char数组类型。
暂时就想到这么多,其实这两个函数都差不多,用的时候知道它们各自的特点就好。
本文总结了C++中getline和cin.getline函数的使用,包括它们的参数意义、适用场景以及读取带有空格字符串的区别。getline适用于赋值给string对象,以换行符为默认结束标志;而cin.getline除限制字符数外,还可接收char数组,读取到指定长度或遇到结束标志为止。
954

被折叠的 条评论
为什么被折叠?



