提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
问题描述
在使用C++的输入输出流时,如果输入两个以空格隔开的字符串,cin>>遇到空格时会结束读取,并把空格留在缓冲区,读取第二个字符串时岂不是继续读取空格直接结束?
一种说法是cin>>遇到空格会跳过
一种说法是cin>>遇到空格会结束
一、看代码
#include <iostream>
using namespace std;
int main(void)
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout<<"Enter your name \n";
cin>>name;
cout<<"Enter your favorite dessert:\n";
cin>>dessert;
cout<< "I have some delicious "<<dessert<<" for you "<< name;
return 0;
}
二、结果分析
Enter your name
abc def
Enter your favorite dessert:
I have some delicious def for you abc
在这里展示了一个问题,在读取字符串时,遇到第一个空格,“abc"被读取到name中,此时” def"被留在缓冲区,为什么下一次读取时不是直接遇到空格结束呢,反而"def"被成功读取?
三、问GPT
cin
对象在默认情况下以空白字符(包括空格、制表符和换行符)作为分隔符。这意味着当你使用 cin
的 >>
运算符来读取数据时,它会将空白字符用于分隔输入,并将每个分隔的部分分配给相应的变量。以下是一些关于输入缓冲区的规则以及 cin >>
的行为:
-
分隔符规则:
cin
默认将空白字符(包括空格、制表符、换行符等)视为分隔符。这意味着cin >>
会读取输入,直到遇到空白字符为止。 -
跳过空白字符:
cin >>
会跳过前导的空白字符(包括空格、制表符),并在遇到下一个空白字符时停止读取。这意味着它将空格用于分隔输入,并将每个分隔的部分分配给相应的变量。 -
输入缓冲区:输入缓冲区是一个存储待读取字符的临时存储区域。当你输入字符时,它们首先被存储在输入缓冲区中。
cin >>
从输入缓冲区中读取字符,并根据空白字符来分隔它们。任何未读取的字符都会留在输入缓冲区中。 -
行缓冲:对于标准输入,通常是行缓冲的。这意味着输入通常以一行为单位读取。当用户按下回车键(换行符 ‘\n’)时,整行文本被存储在输入缓冲区中,然后
cin
会从该行中读取数据,直到遇到空白字符。
总结
可否这样理解,输入流对象在读取到空格之后将"abc"赋给第一个变量,随后的" def"适用跳过空白字符规则,并在读取到回车时,将"def"赋给第二个变量?