请教一个C++程序问题

Far_away_from_home 2018-07-10 11:27:44

如上图第一个程序,先输入名字,然后输入尺寸和重量,程序运行正常,但是第二个程序只是先输入尺寸,然后在输入名字和重量,程序便无法正确运行,这到底是啥原因?
...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Far_away_from_home 2018-07-12
  • 打赏
  • 举报
回复
总结一下,一楼和四楼说的非常正确,之所以出现这样的问题,是因为cin输入时,只将缓冲区中回车‘\n’以前的部分读取,而将'\n'留在了缓冲区,而getline()函数是在检测到'\n'后结束读取,这样就导致getline()检测到cin留在缓冲区里的'\n',从而导致getline()读取空行,程序运行出错。
另外,之所以不采用std::cin>>pt->name;这样的语法,是因为考虑到公司名可能是一个含有空格的字符串,而上述语法只面向单个单词,当输入Pizza Hut时,程序就会出错。
修改后的程序添加了get()函数,用来读取缓冲区中的'\n',接下来getline()函数便不会一开始就因为检测到'\n'而导致程序出错,如图。
新人初学C++,如果说的不对请各位及时指出,最后感谢各层主的回复
weixin_42359982 2018-07-11
  • 打赏
  • 举报
回复
你那个getline()没有输入,所以name那里输出是空的,weight你给的输入是PizzaHut所以输出是个不正确的数字;
你可以直接用 cin>>pt->name;啊为啥要用getline; (我也不清楚为什么getline放在后面会不允许用户输入)
  • 打赏
  • 举报
回复
getline 改成 cin, 一点问题也没有
sghcpt 2018-07-11
  • 打赏
  • 举报
回复
楼主,如果只是想实现代码,可以把代码改为下面的试试:
#include <iostream>
#include <string>
#include <cstring>

int main()
{
struct pizza{ std::string name; double diameter; double weight; };
pizza* pt = new pizza;
std::cout << "What's the pizza's diameter?";
std::cin >> pt->diameter;
std::cout << "What's the company's name?";
std::cin >> pt->name;
std::cout << "What's the pizza's weight?";
std::cin >> pt->weight;

std::cout << "The pizza's diameter is " << pt->diameter << std::endl;
std::cout << "The company's name is " << pt->name << std::endl;
std::cout << "The pizza's weight is " << pt->weight << std::endl;
getchar();
return 0;
}


至于你第二个程序出现的问题情况,感觉应该是getline函数获取到了上一条数据输入的回车按钮,即'\n'字符了,所以就立即返回了,往后你再输入的字符串都对应weight的输入值了,所有就出现乱码了。。
  • 打赏
  • 举报
回复
第2个例子,将getline之前的输入语句改成 (cin >> pt->diameter).get(); 输出也是对的。
  • 打赏
  • 举报
回复
使用了cin之后,在使用newline之前,必须把缓冲区里的换行符冲掉:
If you're using getline after cin >> something, you need to flush the newline out of the buffer in between.

第2个例子,在getline前加一个 cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 就没有问题了。

对于getline的这个问题, stackoverflow上有长篇大论的说明:
https://stackoverflow.com/questions/10553597/cin-and-getline-skipping-input
https://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction

64,682

社区成员

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

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