C语言中利用scanf语句输入多个值的问题

来源:互联网 发布:北京网络职业学院 假期 编辑:程序博客网 时间:2024/04/29 23:15
今天利用共同体变量写了一个小程序要求:有若干人员的数据,其中有学生和教师。学生的数据包括姓名、号码、性别、职业、班级。教师数据包括姓名、号码、性别、职业、职务。要求用同一个表格来处理。编译通过后运行程序,发现输出有问题,通过调试发现问题出现在scanf语句中,原本的scanf语句为scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);调试过程发现此处输入101空格hu空格m空格s空格后,&person[i].job的值被,&person[i].sex覆盖也为m。1.试着在%d %s %c %c中间都加一个空格,输出结果回复正常。2.又想在%d %s %c %c中间加个逗号,输出结果依旧有问题。但写一个简单的scanf函数时1和2两种方法均能输出正常的结果。我想是不是由于使用了结构体变量或者共同体变量才会导致这样的问题,如果是在使用结构体或共同体时对输入输出格式有什么特殊的要求吗?请大家帮我讲一下。源代码奉上(已经改正过):#include<stdio.h>struct student{int num;char name[20];char sex;char job;union {int clas;char position[20];}category;}person[2];int main(){int i;for(i=0;i<2;i++){printf("please enter the date of person:\n");scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);if(person[i].job=='s'){printf("请输入该学生的班级:\n");scanf("%d",&person[i].category.clas);}else if(person[i].job=='t'){printf("请输入该老师的职位:\n");scanf("%s",&person[i].category.position);}elseprintf("输入的job类型有误");}printf("\n");for(i=0;i<2;i++){if(person[i].job=='s')printf("该学生的信息如下:%6d%10s%4c%4c%10d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.clas);elseprintf("该教师的信息如下:%6d%10s%4c%4c%10s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);}return 0;}
我来帮他解答
 
输入内容已经达到长度限制
还能输入 9999 
插入图片删除图片插入地图删除地图插入视频视频地图
取消
2011-8-17 14:39
满意回答
有一个很严重的错误,你输入字符数组的两个scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);scanf("%s",&person[i].category.position);把这两行中字符数组输入时前面的&符号去掉,对字符数组输入本身就是地址,不要加&改成这样scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);scanf("%s",person[i].category.position);其他的也没有什么错误记着输入时候,那几个值之间用一个空格隔开

追问

person[i].num是结构体数组的成员,对成员进行赋值应该要加&吧?还有按照我这样写但从输出结果上看是正确的,不知道是否存在内在的隐患?我刚开始学习C语言,希望您能帮我升入讲解一下。

回答

用scanf()函数输入的时候,本质是,你给scanf一个地址,这个函数会根据你输入的地址把输入缓冲区中的数据放在指定地址处象int ,char,double,long,float这些基本类型,再分配空间的时候,只是给他们一个空间所以用scanf()输入的时候,要加&取地址符号,才能给他们赋值然而char *,char [],这些本身是一块区域的首地址,本身就是地址,所以用scanf时,不用加&因此,你输入里面不需要加的只有,person[i].name,person[i].category.position两个,其他的都是基本类型,因此都需要加

追问

我明白了,像我原来写得可能在运行的时候没有问题,可是在内存中存储的person[i].category.position数据只是输入的字符串的首字符对吧?这个调试的过程中可以看到(今天刚学的调试程序)。