鱼C论坛

 找回密码
 立即注册
查看: 5907|回复: 9

C++ 键盘输入结构体数组元素问题

[复制链接]
发表于 2016-8-5 14:34:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<iostream>
  2. using namespace std;

  3. struct mystruct
  4. {
  5.     char *name;
  6.     int age;
  7.     char *sex;
  8.     char *address;
  9. };
  10. main()
  11. {
  12.     int i;
  13.     mystruct s1;

  14.     char x[10]={NULL};
  15.     char y[10]={NULL};
  16.     char z[20]={NULL};

  17.     cout << "输入姓名:";

  18.     while ((cin.get()!='\n')&&(i<10))
  19.     {
  20.         cin >> x[i];
  21.         i++;
  22.     }

  23.     cout << "输入性别:";

  24.     while ((cin.get()!='\n')&&(i<10))
  25.     {
  26.         cin >> y[i];
  27.         i++;
  28.     }

  29.     cout << "输入地址:" ;

  30.     while ((cin.get()!='\n')&&(i<20))
  31.     {
  32.         cin >> z[i];
  33.         i++;
  34.     }

  35.     cout << "输入年龄:" ;

  36.     cin >> s1.age;

  37.     cout << "***************************" << endl;
  38.     cout << "输入信息为:" << endl;

  39.     s1.name=x;
  40.     s1.sex=y;
  41.     s1.address=z;

  42.     cout << s1.name << "年龄为:" << s1.age << "性别为:" << s1.sex << "地址为:" << s1.address << endl;

  43. }
复制代码


想要通过键盘输入结构体中各个数组元素,然后输出,通过回车键控制结束输入并转到下一数组的输入,但是总是得不到预想的结果,结果如下: 001.JPG
002.JPG

当输入完姓名之后敲回车,程序就结束运行,不能转到下一个数组的输入。求前辈们解答。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-5 15:16:39 | 显示全部楼层
本帖最后由 Krant5 于 2016-8-5 15:18 编辑

我也不太清楚cin.get()怎么作用的,最好别用,以前在c语言里getchar()用的比较习惯。有个共同点cin读入字符串貌似也不会带空格
805a.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 15:42:32 | 显示全部楼层
您好,cin.get()方法的作用是从键盘读入一个字符,所以您在while循环判断条件上面用get方法会忽略掉一些您所输入的字符,比如您在姓名那里填写1234567890,那么最后打印出来的就是24680,因为每次循环都要先读入一个字符作为判断条件然后才是执行cin >> x[i]; 。而且您的i没有在每次读入的时候设为0,所以其他的信息就没法读进字符数组了。其实使用C++最好用string类,这样比较方便快捷而且安全。如果有疑问就回复一下吧,大家一起进步!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 15:53:08 | 显示全部楼层
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;

  4. struct mystruct
  5. {
  6.     char *name;
  7.     int age;
  8.     char *sex;
  9.     char *address;
  10. };
  11. int main()
  12. {
  13.     int i;
  14.     mystruct s1;

  15.     char x[10];
  16.     char y[10];
  17.     char z[20];

  18.     cout << "Name: ";

  19.     while ((cin.get()!='\n')&&(i<10))
  20.     {
  21.         cin >> x[i];
  22.         i++;
  23.     }

  24.     cout << "Sex: ";

  25.     i=0;
  26.     while ((cin.get()!='\n')&&(i<10))
  27.     {
  28.         cin >> y[i];
  29.         i++;
  30.     }

  31.     cout << "Address: " ;

  32.     i=0;
  33.     while ((cin.get()!='\n')&&(i<20))
  34.     {
  35.         cin >> z[i];
  36.         i++;
  37.     }

  38.     cout << "Age: " ;

  39.     cin >> s1.age;

  40.     cout << "***************************" << endl;
  41.     cout << "Info: " << endl;

  42.     s1.name=x;
  43.     s1.sex=y;
  44.     s1.address=z;

  45.     cout << s1.name << "\nAge: " << s1.age << "\nSex: " << s1.sex << "\nAddress: " << s1.address << endl;
  46.     system("pause");

  47.     return 0;
  48. }
复制代码


这是修改完迭代变量i初始化bug的代码,下面贴子完整分析下运行结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 16:01:57 | 显示全部楼层
微信截图_20160805155322.jpg

上图是上面帖子代码的运行结果。

为什么输入 asd回车asd回车 输出来的结果是sad?

我们来分析下:
1.首先代码是先执行while里面的cin.get()方法读入一个字符,在这里是a,不等于回车所以循环继续。
2.程序执行cin >> x[i]; 此时输入流读入第二个字符,也就是s,读入x[0]=='s'。
3.程序循环,再次执行while里面的cin.get(),读入另外一个字符,此时读入的是d,继续执行循环体。
4.程序执行cin >> x[i]; 读入下一个字符,此时是回车,由于没有特殊情况cin是会忽略空白字符的,所以cin忽略了回车,继续读下一个字符也就是第二行的a,x[1]=='a'。
5.程序继续执行判断条件上面的cin.get(),此时读入s,继续循环。
6.程序执行cin >> x[i]; 此时读入d,x[2]=='d'。
7.程序执行cin.get(),此时读入的字符为回车即是\n,循环退出!

这就是第一个while循环的原理,另外三个也是同样道理。

最后强调一遍:最好别用C++的语法来打C语言的代码。

大家一起加油!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 16:03:15 | 显示全部楼层
Ouyancheng 发表于 2016-8-5 16:01
上图是上面帖子代码的运行结果。

为什么输入 asd回车asd回车 输出来的结果是sad?

为毛一打分号之后的代码都变斜体了......这设计得不科学啊~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 16:48:57 | 显示全部楼层
cin.get()遇到空格应该就结束了吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 17:33:51 | 显示全部楼层
Krant5 发表于 2016-8-5 15:16
我也不太清楚cin.get()怎么作用的,最好别用,以前在c语言里getchar()用的比较习惯。有个共同点cin读入字符 ...

多谢多谢,,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 17:34:26 | 显示全部楼层
Ouyancheng 发表于 2016-8-5 15:42
您好,cin.get()方法的作用是从键盘读入一个字符,所以您在while循环判断条件上面用get方法会忽略掉一些您 ...

恩,多谢了,解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 17:37:24 | 显示全部楼层
Ouyancheng 发表于 2016-8-5 16:01
上图是上面帖子代码的运行结果。

为什么输入 asd回车asd回车 输出来的结果是sad?

恩,多谢分析,我也是不太明白cin.get()就直接拿来用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-13 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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