VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 298|回复: 5

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

[复制链接]
菜鸟从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。请问是什么问题???



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

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

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

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

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

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

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

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

回复 支持 反对

使用道具 举报

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

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


现在问题是:如何读入一行字符串?就算中间有空格也不影响呢?string类的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

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

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

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

回复 支持 反对

使用道具 举报

 楼主| 菜鸟从0开始 发表于 2017-11-7 20:00:33 | 显示全部楼层
已经解决。下面是运行的图片

原因是:从控制台界面输入的字符,最后需要加换行符才能送入缓冲区,就是必须要按一下“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. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

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

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

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

回复 支持 反对

使用道具 举报

besteast 发表于 6 天前 | 显示全部楼层
zzzzzzzzzzzzzzzzzzzzzz

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

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

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

回复 支持 反对

使用道具 举报

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

本版积分规则

展开

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-11-24 09:54

Powered by Discuz!

© 2009-2017 cctry.com

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