深刻搞懂scanf与cin在读取时遇到空格的处理

真的是困扰了我好久

我们先看这样一串代码:

int main()
{
	string s;
	char str[10];
	cin >> s;
	scanf("%s", str);
	cout << s << endl;
	cout << str << endl;

	return 0;
}

我在终端上输入:123 abc,得到的结果是这样的:

深刻搞懂scanf与cin在读取时遇到空格的处理_第1张图片

为什么第二个字符串str我没有给他输入,他却自动输出了呢?

事实上,我们使用scanf或cin从键盘里来读取输入时,都会有一个缓冲区,我们是把内容先读取到缓冲区中,然后在数据再从缓冲区中读走数据的。并且,不管是整形还是什么类型,计算机都是将它看成是字符串的。 再者,scanf与cin在读取数据时遇到空格或换行时都会终止读取了。

如果我们想读取包括空格的字符串时,可以这么做:

①scanf,使用scanf("%[^\n]%*c", s); 其中,%[^\n] 可以读取空格,而后面的 %*c 可以把换行给解决掉;例如,下面的代码中,我们读取了 hello world并且 包含了一个换行, 如果我们没有写后面的 %*c ,那么字符c就是一个换行了。(我在vs中使用C++容器的string没有这项功能)

深刻搞懂scanf与cin在读取时遇到空格的处理_第2张图片
不写 %*c :

深刻搞懂scanf与cin在读取时遇到空格的处理_第3张图片

②cin:使用cin.getline(s, 100);

cin.gteline函数有两个参数,第一个是用来存储输入行的数组的名称,第二个参数是要读取的字符数,如果这个参数为100,则函数最多可以读取99个字符,余下的空间用来存储自动在结尾处添加的空字符。getline成员函数在读取指定数目的字符或遇到换行符时停止读取。

深刻搞懂scanf与cin在读取时遇到空格的处理_第4张图片

注意: cin.getline()会丢掉最后我们输入的换行符,与 scanf("%[^\n]%*c 是一致的,就输入的缓冲区中不会有换行符了,还有一个 c.get() 他不会丢掉换行符,用的比较少,一般都会使用 c.getline()

你可能感兴趣的:(c语言深度剖析,c++)