关于cin.get()与cin,以及换行符问题

猫头鹰与猫 2013-08-04 10:59:09
程序
#include <iostream>
using namespace std;
struct user
{
char name[20];
char volume[20];
double price;
};
int main()
{
user* ps = new user;
cout<<"Input Your Name:";
cin.get(ps->name,20);
cout<<"Enter volume in cubic feet:";
//cin.get(); 如果加上这一句, 程序就没有问题
cin.get((*ps).volume,20);
cout<<"Enter price:";
cin>>(*ps).price;
cout<<"Hello,"<<ps->name<<",Your Volume is "<<ps->volume<<" with "<<ps->price<<" Dollars."<<endl;
}

按理说第一次使用完cin.get()后换行符没有被抛弃,那么换行符被第二次的cin.get()给接受了,第三次的 cin>>(*ps).price;应该可以正常使用才对。

但实际上只有第一次 cin.get(ps->name,20);起到了作用,
剩下的cin.get((*ps).volume,20);和cin>>(*ps).price;
都被跳过了,怎么回事?
...全文
538 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
大尾巴猫 2013-08-07
  • 打赏
  • 举报
回复
引用 9 楼 u011595437 的回复:
我想问问,我写了一个程序,发现cin>>怎么没有抛弃换行符? 不是说cin>>会抛弃换行符吗?
cin >> 会忽略缓冲区当中开头的换行符(上次遗留的换行),但不会抛弃这次输入产生的换行符。把这个换行符留在缓冲区了,所以下次用 cin >> 没问题,用 cin.get() 输入一行就不行了。
猫头鹰与猫 2013-08-07
  • 打赏
  • 举报
回复
引用 7 楼 ananluowei 的回复:
[quote=引用 6 楼 u011595437 的回复:] 实际运行中我只能输入第一次啊,第二次和第三次都是被系统直接跳过的。 何来“缓冲区残留的是你第二次输入的字符”?
很久没复习过基础知识,有点忘记了。 cin.get(*ps).volume,20) 在读取的时候,读到了上次遗留的换行,所以实际上读取了一个空行,导致cin失效。 需要cin.clear(),清除失效标志后,才能继续cin 所以你第三次无法完成输入。 cin.get()只读取一个字符,所以读到了换行符,不会失效。 当你把cin.get()放在第二次输入前,整个程序没问题。 cin.get()和cin.get(字符串名,长度)对于读取到一个换行,有不同结果。[/quote] 我想问问,我写了一个程序,发现cin>>怎么没有抛弃换行符? 不是说cin>>会抛弃换行符吗?
猫头鹰与猫 2013-08-07
  • 打赏
  • 举报
回复
引用 7 楼 ananluowei 的回复:
[quote=引用 6 楼 u011595437 的回复:] 实际运行中我只能输入第一次啊,第二次和第三次都是被系统直接跳过的。 何来“缓冲区残留的是你第二次输入的字符”?
很久没复习过基础知识,有点忘记了。 cin.get(*ps).volume,20) 在读取的时候,读到了上次遗留的换行,所以实际上读取了一个空行,导致cin失效。 需要cin.clear(),清除失效标志后,才能继续cin 所以你第三次无法完成输入。 cin.get()只读取一个字符,所以读到了换行符,不会失效。 当你把cin.get()放在第二次输入前,整个程序没问题。 cin.get()和cin.get(字符串名,长度)对于读取到一个换行,有不同结果。[/quote] 你讲对了!!厉害!
大尾巴猫 2013-08-05
  • 打赏
  • 举报
回复
引用 6 楼 u011595437 的回复:
实际运行中我只能输入第一次啊,第二次和第三次都是被系统直接跳过的。 何来“缓冲区残留的是你第二次输入的字符”?
很久没复习过基础知识,有点忘记了。 cin.get(*ps).volume,20) 在读取的时候,读到了上次遗留的换行,所以实际上读取了一个空行,导致cin失效。 需要cin.clear(),清除失效标志后,才能继续cin 所以你第三次无法完成输入。 cin.get()只读取一个字符,所以读到了换行符,不会失效。 当你把cin.get()放在第二次输入前,整个程序没问题。 cin.get()和cin.get(字符串名,长度)对于读取到一个换行,有不同结果。
猫头鹰与猫 2013-08-05
  • 打赏
  • 举报
回复
引用 5 楼 ananluowei 的回复:
[quote=引用 3 楼 u011595437 的回复:] 这我了解了。问题是第一次cin.get()残留下的换行符应该被第二次的cin.get给吃掉了才对。 理论上来说第三次cin〉〉应该是可以输入到的,但实际上不能输入。
第二次的ccin.get((*ps).volume,20); 确实把上次留下的换行符吃掉了,而且volume没有成功接受你的输入,volume是空的。 第三次 cin >> double,缓冲区残留的是你第二次输入的字符,当然通不过。[/quote] 实际运行中我只能输入第一次啊,第二次和第三次都是被系统直接跳过的。 何来“缓冲区残留的是你第二次输入的字符”?
大尾巴猫 2013-08-04
  • 打赏
  • 举报
回复
引用 3 楼 u011595437 的回复:
这我了解了。问题是第一次cin.get()残留下的换行符应该被第二次的cin.get给吃掉了才对。 理论上来说第三次cin〉〉应该是可以输入到的,但实际上不能输入。
第二次的ccin.get((*ps).volume,20); 确实把上次留下的换行符吃掉了,而且volume没有成功接受你的输入,volume是空的。 第三次 cin >> double,缓冲区残留的是你第二次输入的字符,当然通不过。
猫头鹰与猫 2013-08-04
  • 打赏
  • 举报
回复
另外,如果把第二次的cin。get换成cin〉〉接受,也会正常起来。 这又让我糊涂了。 不是残留了一个换行符吗,cin>>怎么遇到换行符不跳过?
猫头鹰与猫 2013-08-04
  • 打赏
  • 举报
回复
引用 2 楼 ananluowei 的回复:
cin.get()不丢弃缓冲区的换行符 所以这么用 cin.get(ps->name,20).get(); 每次用cin.get(..)读取字符串后跟一个.get() 或者用cin.getline读字符串吧。 cin.getline会丢弃换行符
这我了解了。问题是第一次cin.get()残留下的换行符应该被第二次的cin.get给吃掉了才对。 理论上来说第三次cin〉〉应该是可以输入到的,但实际上不能输入。
大尾巴猫 2013-08-04
  • 打赏
  • 举报
回复
cin.get()不丢弃缓冲区的换行符 所以这么用 cin.get(ps->name,20).get(); 每次用cin.get(..)读取字符串后跟一个.get() 或者用cin.getline读字符串吧。 cin.getline会丢弃换行符
max_min_ 2013-08-04
  • 打赏
  • 举报
回复


关于连续读标准输入的时候是有这样的情况,
就是第二次读了时候,会读到第一次的'\n'字符,导致结束了标准输入,
也就跳过了后面的输入

//get不清除怎么解决的,但是对于scanf的解决方法是:
scanf("%s", ps->name);
//第二次输入的时候 空个空格可以解决问题
scanf(" %s", ps->volume);
scanf(" %lf", &ps->price)
资源下载链接为: https://pan.quark.cn/s/f1ead55c4354 以下标题“H5页面模板源码,很不错的例子”暗示了我们讨论的主题是关于HTML5页面模板的源代码。HTML5是现代网页开发的核心技术,它提供了丰富的功能和元素,让开发者能够构建出更具交互性、动态性和响应式的网页。“很不错的例子”表明这些源码不仅具有实用性,还具备一定的教学意义,既可以作为项目开发的直接素材,也能供学习参考。 在描述“H5页面模板源码,非常酷炫的HTML5模板,可以直接使用,也可以参考学习”中,“非常酷炫”意味着这些模板可能融合了诸多高级特性,例如动画效果、媒体元素的运用以及响应式设计等,这些都是HTML5技术的优势所在。可以直接使用表明用户无需从零开始编写代码,能迅速搭建出吸引人的网页。同时,这些模板也适合学习,用户通过查看源代码可以了解特定设计和功能的实现方式,从而提升自身的HTML5开发能力。 标签“H5 手机网页 H5源代码 手机html”进一步明确了主题。“H5”是HTML5的简称,“手机网页”和“手机html”则强调这些模板是针对移动设备优化的。在如今移动优先的时代,适应各种屏幕尺寸和触摸操作的网页设计极为重要。这表明这些源码很可能是响应式的,能够根据设备自动调整布局,以适配手机、平板电脑等多种设备。 从“压缩包文件的文件名称列表”来看,虽然无法直接从文件名得知具体源码内容,但可以推测这些文件可能包含多种HTML5模板示例。“不错的样子.txt”可能是一个介绍或说明文件,对模板进行简要描述或提供使用指南。而“1-30”这样的命名方式可能意味着有30个不同的模板实例,每个模板对应一个独立文件,涵盖多种设计风格和功能,为学习和实践提供了全面的平台。 总的来说,这个资源集合为HTML5开发者或初学者提供了一套实用且酷炫的移动网页模板源代码。这些模板既可以直接应用于项目

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧