C++中的cin结束后使用cin.getline()不能输入的问题

c++ pp page68

https://blog.csdn.net/leowinbow/article/details/82190631

cin 后使用 cin.getline():

当cin结束后,将回车键生成的换行符留在了输入队列中(cin 不丢弃空白符 p68,534),后面的cin.getline()看到了该换行符后,认为是一个空行,并将空字符串赋值给相应变量。

cin 后使用 cin:

并不会出现这种情况,因为cin的时候,虽然cin根据空格、制表符以及换行符来确定输入结束,但开始输入之前它们跳过空白(空格、换行符和制表符),直到遇到非空白字符(p612),所以cin>>在等待键盘敲入时,你哪怕先敲回车符,cin>>语句也不会执行结束。

ps:

c++ pp page65

getline()和get()都可以读取一行的输入,直到达到换行符;随后,getline()将丢弃换行符,即将换行符从输入队列中删除,而get()将换行符保留在输入队列中。例子见P138.

------------------------------------分割线---------------------------------------------------

注意,无参数的cin.get()读取下一个字符。

------------------------------------分割线2022/2/22--------------------------------------

关于cin根据空格、制表符以及换行符来确定输入结束(c++ pp page65):

若有语句:

int a;
cin>>a;

当输入:

1 2 3 4 5 [Enter]

时,显然a的值为1;

因为cin使用空格、制表符和换行符来确定输入结束,而读取到1后遇到了空格,所以输入结束。但是此时,剩余的输入

 2 3 4 5 [Enter]

仍然在输入队列中(注意2之前有一个空格,因为cin不丢弃换行符、空格、制表符?),并没有被丢弃。

所以若将输入语句放入循环中:

while(cin>>value){
    ++count;
    sum+=value;      
}

此时输入:

1 2 3 4 5 [Enter]

6 7 8 9 10 [Enter]

11[Ctrl+Z]

那么count的值为11;

因为cin语句处于循环中时,若没有遇到EOF(Ctrl+Z),输入类型不匹配等错误,就会一直输入(当遇到空格时,开始输入之前它们跳过空白(空格、换行符和制表符),直到遇到非空白字符(p612),所以继续输入);因为cin>>value实际上是cin的一个方法函数调用,该函数返回cin。如果cin位于测试条件中(如while循环的判定中),则将被转换为bool类型,如果输入成功,转换后的值为true,否则为false。(参考C++ pp page 155 163)

------------------------------2022/2/24--------------------------

注意,将cout,cin看作输入输出缓冲区(输入输出流),而不要看作一定为手动收入,输出到屏幕

考虑如下代码:

int main()
{
    char ch;
    cin>>ch;
    while(ch != 'q')
    {
        cout<<ch<<endl;
        cin>>ch;
    }
}

若输入为

abcd[Enter]

输出为?

解释:当输入为 abcd[Enter] 时,输入缓冲区内就有了 abcd[Enter] ,字符'a'先存储进ch,缓冲区内还剩下 bcd[Enter] ,进入while循环,’a‘ != 'q',所以输出字符'a',然后执行 cin>>ch; 注意,这里因为输入缓冲区内仍有内容,所以不是手动输入,而是缓冲区内的下一个字符自动存储进ch内;同理剩下三个字符的也是如此。

考虑输入为

ab cd[Enter]

输出为?

因为cin不允许输入为空,所以遇到空格时,再继续将缓冲区下一个字符送进ch内。

-----------------------------------2022/4/3----------------------------------

判断 get(char *, int) 是否读取到了空行:

c++11中,get(char *, int)在读取到了空行后返回false;

较早的版本中,get(char * ,int)在读取到了空行之后,返回值不为false;但,如果读取到了一个空行,则字符串中的第一个字符是控制符 '\0';

因此判断 get(char *, int) 是否读取到了空行:

char temp[50];
cin.get(temp,50);
if(!cin || temp[0] == '\0')
    break;

 

posted @ 2022-02-08 20:06  SanFranciscoo  阅读(697)  评论(0编辑  收藏  举报