c++ 关于cin流问题?

为什么多了几行cin.get(ch)显示的字符却变少了呢?
还有ch是char形式
但是能连续输出字符,是不是给他一次输入多个字符存在cin流中,当进入while循环再遇到cin流直接忽视再循环逐一输出字符,直到cin流空了后才开始使用while内的cin流?

#include <iostream>
using namespace std;
int main()
{
    char ch;
    int count=0;
    cin.get(ch);
    while(cin)
    {
        cout<<ch;
        ++count;
        cin.get(ch);
    }

    cout<<endl<<count<<endl;

    return 0;
}

图片描述

#include <iostream>
using namespace std;
int main()
{
    char ch;
    int count=0;
    cin.get(ch);
    cin.get(ch);
    cin.get(ch);
    while(cin)
    {
        cout<<ch;
        ++count;
        cin.get(ch);
    }

    cout<<endl<<count<<endl;

    return 0;
}

图片描述

阅读 3.2k
1 个回答

首先你这个程序最后一句是很好的,它输出了整个循环的次数,但是看你的执行结果你没有把它显示出来,按下ctrl+d(文件尾)可以结束这个循环;

cout<<endl<<count<<endl;

对于输入,系统是有自己的输入缓冲区的,你要求的是一个一个字符读入,输入的时候提供了一串字符,系统会自动保存到输入缓冲区等待读取。
cin.get(ch);执行一次会从缓冲区中拿出一个字符(从缓冲区中抹去这个字符)
第二个程序中以你的输入“lin”为例,第一条cin.get(ch)拿到‘l’,第二条拿到‘i’,第三条拿到‘n’,这时候才进入循环,开始打印,所以才只输出了‘n’。
这个时候如果你去打印count的值,你会发现是2,也许你会感到奇怪,明明就只读取了一个字符‘n’,为什么会进行两次循环呢?因为在你输入完“lin”之后你按下了回车‘n’,cin.get(ch)会读取到这个字符,所以进行了二次循环。
对于缓冲区理解不够的程序员在码代码的时候往往会因为这个‘n’而感到苦恼
PS:也许你是想通过这个程序来熟练缓冲区,但如果这是你平时的编程习惯,那需要改善。给个例子

#include <iostream>
using namespace std;

int main()
{
    int data;
    while(cin>>data)
    {
        cout << data << endl;
    }

    return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题