cin与cin.getline(s)连用时可能出现的错误
·
我们运行
cin >> obj;
cin.getline(s);
这两条语句的时候,会发生错误,此时s中的存储内容为空。

小伙伴们可以花一分钟时间写个小代码,自己检验一下s是不是为空。
原因如下。
在计算机不是直接从屏幕上读取数据,而是将屏幕上的数据读入输入缓冲区中,计算机cpu从输入缓冲区读取数据。用户输入会以回车键结束输入(oj系统用ctrl+z或其他指令结束输入),而输入缓冲区也会读入这个回车。我们把结束输入的指令叫做结束符。
关于cin。每次执行cin时,输入缓冲区会丢弃上一个输入残留下来的结束符。也就是说,当次cin结束后,会留下一个结束符。
关于getline(cin, s)。每次执行getline(cin, s)时,计算机会持续读取字符,直到遇到结束符,最终将读取到的字符串赋值给s,并丢弃读取到的结束符。
当我们运行cin指令时,用户在屏幕上输入n的值,同时还会输入回车键(标记当次输入结束),输入缓冲区将这两个char值都读入。此时cpu从输入缓冲区中读取n的值,char(回车键)留在缓冲区中,没有被丢弃。
接着运行getline(cin, s),cpu从缓冲区中读取到了char(回车),结束读取,并丢弃回车符,于是s中的内容为空
解决办法
运行getline(cin,s);之前,先清空缓冲区中的结束符,调用cin.ignore()即可。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)