VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 1264|回复: 6

为什么结构数组中的string输入不正确??

[复制链接]
15_avatar_middle
在线会员 菜鸟从0开始 发表于 2017-11-6 20:49:36 | 显示全部楼层 |阅读模式
程序目的是:
连续输入3个披萨的sbrand   、 dzhijing  、 dweight。
然后支持输入一个数字,查询披萨的相关数据。
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. int main()
  5. {
  6.         struct pizza
  7.         {
  8.                 string sbrang;
  9.                 double dzhijing;
  10.                 double dweight;
  11.         };
  12.         pizza* Ppzz=new pizza[3];
  13.        
  14.         for (int i=1;i<=3;i++)
  15.         {
  16.         cout <<"请输入第"<<i<<"个pizza的品牌: \n";///????为什么第二个就sbrand就不能输入了?
  17.         getline(cin,(Ppzz+i-1)->sbrang);
  18.         cout <<"请输入第"<<i<<"个pizza的直径: \n";
  19.         cin >> (Ppzz+i-1)->dzhijing;
  20.         cout << "请输入第"<<i<<"个pizza的重量: \n";
  21.         cin >> (Ppzz+i-1)->dweight;
  22.         };
  23.        
  24.        
  25.         cout <<"请输入要查询第几个pizza: "<<endl;
  26.         int j;
  27.         cin >>j;
  28.         cout <<"pizza的品牌为:"<<(Ppzz+j-1)->sbrang<<endl;
  29.         cout <<"pizza的直径为:"<<(Ppzz+j-1)->dzhijing<<endl;
  30.         cout <<"pizza的重量为:"<<(Ppzz+j-1)->dweight<<endl;
  31.         delete [] Ppzz;

  32.         return 0;
  33. }
复制代码

但是出现了如下图的情况,直接跳过第二次输入sbrand。请问是什么问题???

为什么结构数组中的string输入不正确??





上一篇:VC操作ado远程连接数据库,如何实现断网重连
下一篇:《实用C++》第15课 期中知识总结

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-6 20:51:49 | 显示全部楼层
求教!!!@Syc

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-11-7 10:06:42 | 显示全部楼层

默认情况下 cin 输入完成后我们大多以回车符结束输入。所以在输入完 cin >> (Ppzz+i-1)->dweight; 这句话之后,输入缓冲区中还有一个回车符,之后执行到第二次循环的时候,getline 发现缓冲区冲有内容,于是直接从输入缓冲区中取出回车符,所以第二次循环的 getline 就直接过了。那么楼主会问了,为什么第二次的 cin 没有问题呢?因为 cin 本身有一个默认状态是为输入操作符(即“>>"操作符)跳过空白,所以默认情况下用输入操作符读取时会跳过回车符等空白字符。

解决方法也很简单,既然用 cin 了就都用 cin:
改成这样就可以了:
cin >> (Ppzz + i - 1)->sbrang;

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-7 17:00:08 | 显示全部楼层
本帖最后由 菜鸟从0开始 于 2017-11-7 17:01 编辑

用了这串语句之后,情况好多了。但是,只要输入带空格的字符串,例如“hello world”这种中间存在空格符的,还是会出错。

为什么结构数组中的string输入不正确??
现在问题是:如何读入一行字符串?就算中间有空格也不影响呢?string类的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-7 20:00:33 | 显示全部楼层
已经解决。下面是运行的图片
为什么结构数组中的string输入不正确??
原因是:从控制台界面输入的字符,最后需要加换行符才能送入缓冲区,就是必须要按一下“enter”键。因此,把换行符也送入了缓冲区。
我的解决办法是:我在每一次读取缓冲区的数据之后,都加入了一次cin.get(),把换行符读取掉(虽然没什么用,实际上是把换行符丢弃了)
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. int main()
  5. {
  6.         struct pizza
  7.         {
  8.                 string sbrang;
  9.                 double dzhijing;
  10.                 double dweight;
  11.         };
  12.         pizza* Ppzz=new pizza[3];
  13.        
  14.         for (int i=1;i<=3;i++)
  15.         {
  16.         cout <<"请输入第"<<i<<"个pizza的品牌: \n";///????为什么第二个就sbrand就不能输入了?
  17.         string temp;
  18.         getline(cin,temp);

  19.         (Ppzz + i - 1)->sbrang=temp;
  20.         cout <<"请输入第"<<i<<"个pizza的直径: \n";
  21.         cin >> (Ppzz+i-1)->dzhijing;
  22.                 cin.get();
  23.         cout << "请输入第"<<i<<"个pizza的重量: \n";
  24.         cin >> (Ppzz+i-1)->dweight;
  25.                 cin.get();
  26.         };
  27.        
  28.        
  29.         cout <<"请输入要查询第几个pizza: "<<endl;
  30.         int j;
  31.         cin >>j;
  32.         cout <<"pizza的品牌为:"<<(Ppzz+j-1)->sbrang<<endl;
  33.         cout <<"pizza的直径为:"<<(Ppzz+j-1)->dzhijing<<endl;
  34.         cout <<"pizza的重量为:"<<(Ppzz+j-1)->dweight<<endl;
  35.         delete [] Ppzz;

  36.         return 0;
  37. }
复制代码

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 besteast 发表于 2017-11-18 16:47:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-18 18:29

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表