我们先看这样一串代码:
int main()
{
string s;
char str[10];
cin >> s;
scanf("%s", str);
cout << s << endl;
cout << str << endl;
return 0;
}
我在终端上输入:123 abc,得到的结果是这样的:
为什么第二个字符串str我没有给他输入,他却自动输出了呢?
事实上,我们使用scanf或cin从键盘里来读取输入时,都会有一个缓冲区,我们是把内容先读取到缓冲区中,然后在数据再从缓冲区中读走数据的。并且,不管是整形还是什么类型,计算机都是将它看成是字符串的。 再者,scanf与cin在读取数据时遇到空格或换行时都会终止读取了。
如果我们想读取包括空格的字符串时,可以这么做:
①scanf,使用scanf("%[^\n]%*c", s);
其中,%[^\n] 可以读取空格,而后面的 %*c 可以把换行给解决掉;例如,下面的代码中,我们读取了 hello world并且 包含了一个换行, 如果我们没有写后面的 %*c ,那么字符c就是一个换行了。(我在vs中使用C++容器的string没有这项功能)
不写 %*c :
②cin:使用cin.getline(s, 100);
cin.gteline函数有两个参数,第一个是用来存储输入行的数组的名称,第二个参数是要读取的字符数,如果这个参数为100,则函数最多可以读取99个字符,余下的空间用来存储自动在结尾处添加的空字符。getline成员函数在读取指定数目的字符或遇到换行符时停止读取。
注意: cin.getline()会丢掉最后我们输入的换行符,与 scanf("%[^\n]%*c 是一致的,就输入的缓冲区中不会有换行符了,还有一个 c.get() 他不会丢掉换行符,用的比较少,一般都会使用 c.getline()