C++ 键盘输入结构体数组元素问题
#include<iostream>using namespace std;
struct mystruct
{
char *name;
int age;
char *sex;
char *address;
};
main()
{
int i;
mystruct s1;
char x={NULL};
char y={NULL};
char z={NULL};
cout << "输入姓名:";
while ((cin.get()!='\n')&&(i<10))
{
cin >> x;
i++;
}
cout << "输入性别:";
while ((cin.get()!='\n')&&(i<10))
{
cin >> y;
i++;
}
cout << "输入地址:" ;
while ((cin.get()!='\n')&&(i<20))
{
cin >> z;
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;
}
想要通过键盘输入结构体中各个数组元素,然后输出,通过回车键控制结束输入并转到下一数组的输入,但是总是得不到预想的结果,结果如下:
当输入完姓名之后敲回车,程序就结束运行,不能转到下一个数组的输入。求前辈们解答。 本帖最后由 Krant5 于 2016-8-5 15:18 编辑
我也不太清楚cin.get()怎么作用的,最好别用,以前在c语言里getchar()用的比较习惯。有个共同点cin读入字符串貌似也不会带空格 您好,cin.get()方法的作用是从键盘读入一个字符,所以您在while循环判断条件上面用get方法会忽略掉一些您所输入的字符,比如您在姓名那里填写1234567890,那么最后打印出来的就是24680,因为每次循环都要先读入一个字符作为判断条件然后才是执行cin >> x; 。而且您的i没有在每次读入的时候设为0,所以其他的信息就没法读进字符数组了。其实使用C++最好用string类,这样比较方便快捷而且安全。如果有疑问就回复一下吧,大家一起进步! #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;
char y;
char z;
cout << "Name: ";
while ((cin.get()!='\n')&&(i<10))
{
cin >> x;
i++;
}
cout << "Sex: ";
i=0;
while ((cin.get()!='\n')&&(i<10))
{
cin >> y;
i++;
}
cout << "Address: " ;
i=0;
while ((cin.get()!='\n')&&(i<20))
{
cin >> z;
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的代码,下面贴子完整分析下运行结果。
上图是上面帖子代码的运行结果。
为什么输入 asd回车asd回车 输出来的结果是sad?
我们来分析下:
1.首先代码是先执行while里面的cin.get()方法读入一个字符,在这里是a,不等于回车所以循环继续。
2.程序执行cin >> x; 此时输入流读入第二个字符,也就是s,读入x=='s'。
3.程序循环,再次执行while里面的cin.get(),读入另外一个字符,此时读入的是d,继续执行循环体。
4.程序执行cin >> x; 读入下一个字符,此时是回车,由于没有特殊情况cin是会忽略空白字符的,所以cin忽略了回车,继续读下一个字符也就是第二行的a,x=='a'。
5.程序继续执行判断条件上面的cin.get(),此时读入s,继续循环。
6.程序执行cin >> x; 此时读入d,x=='d'。
7.程序执行cin.get(),此时读入的字符为回车即是\n,循环退出!
这就是第一个while循环的原理,另外三个也是同样道理。
最后强调一遍:最好别用C++的语法来打C语言的代码。
大家一起加油! Ouyancheng 发表于 2016-8-5 16:01
上图是上面帖子代码的运行结果。
为什么输入 asd回车asd回车 输出来的结果是sad?
为毛一打分号之后的代码都变斜体了......这设计得不科学啊~ cin.get()遇到空格应该就结束了吧。 Krant5 发表于 2016-8-5 15:16
我也不太清楚cin.get()怎么作用的,最好别用,以前在c语言里getchar()用的比较习惯。有个共同点cin读入字符 ...
多谢多谢,,, Ouyancheng 发表于 2016-8-5 15:42
您好,cin.get()方法的作用是从键盘读入一个字符,所以您在while循环判断条件上面用get方法会忽略掉一些您 ...
恩,多谢了,解决了 Ouyancheng 发表于 2016-8-5 16:01
上图是上面帖子代码的运行结果。
为什么输入 asd回车asd回车 输出来的结果是sad?
恩,多谢分析,我也是不太明白cin.get()就直接拿来用了
页:
[1]