鱼C论坛

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

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

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

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

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

x
#include<iostream>
using namespace std;

struct mystruct
{
    char *name;
    int age;
    char *sex;
    char *address;
};
main()
{
    int i;
    mystruct s1;

    char x[10]={NULL};
    char y[10]={NULL};
    char z[20]={NULL};

    cout << "输入姓名:";

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

    cout << "输入性别:";

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

    cout << "输入地址:" ;

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

    cout << "输入年龄:" ;

    cin >> s1.age;

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

    s1.name=x;
    s1.sex=y;
    s1.address=z;

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

}

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

当输入完姓名之后敲回车,程序就结束运行,不能转到下一个数组的输入。求前辈们解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

struct mystruct
{
    char *name;
    int age;
    char *sex;
    char *address;
};
int main()
{
    int i;
    mystruct s1;

    char x[10];
    char y[10];
    char z[20];

    cout << "Name: ";

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

    cout << "Sex: ";

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

    cout << "Address: " ;

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

    cout << "Age: " ;

    cin >> s1.age;

    cout << "***************************" << endl;
    cout << "Info: " << endl;

    s1.name=x;
    s1.sex=y;
    s1.address=z;

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

    return 0;
}

这是修改完迭代变量i初始化bug的代码,下面贴子完整分析下运行结果。
想知道小甲鱼最近在做啥?请访问 -> 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语言的代码。

大家一起加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

为毛一打分号之后的代码都变斜体了......这设计得不科学啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-5 16:48:57 | 显示全部楼层
cin.get()遇到空格应该就结束了吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢多谢,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

恩,多谢了,解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

恩,多谢分析,我也是不太明白cin.get()就直接拿来用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 06:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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