我们运行

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()即可。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐