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

今天利用共同体变量写了一个小程序要求:有若干人员的数据,其中有学生和教师。学生的数据包括姓名、号码、性别、职业、班级。教师数据包括姓名、号码、性别、职业、职务。要求用同一个表格来处理。
编译通过后运行程序,发现输出有问题,通过调试发现问题出现在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);
}
else
printf("输入的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);
else
printf("该教师的信息如下:%6d%10s%4c%4c%10s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
}
return 0;

}

1、有一个很严重的错误,输入字符数组的两个

scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);

scanf("%s",&person[i].category.position);

2、把这两行中字符数组输入时前面的&符号去掉,对字符数组输入本身就是地址,不要加&,改成这样

scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);

scanf("%s",person[i].category.position);

3、其他的也没有什么错误,记着输入时候,那几个值之间用一个空格隔开,用scanf()函数输入的时候,本质是,你给scanf一个地址,这个函数会根据你输入的地址把,输入缓冲区中的数据放在指定地址处

4、像int ,char,double,long,float这些基本类型,再分配空间的时候,只是给他们一个空间,所以用scanf()输入的时候,要加&取地址符号,才能给他们赋值

5、然而char *,char [],这些本身是一块区域的首地址,本身就是地址,所以用scanf时,不用加&因此,输入里面不需要加的只有,person[i].name,person[i].category.position两个,其他的都是基本类型,因此都需要加

扩展资料:

优缺点

1、简洁紧凑、灵活方便

C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

C语言的 Hello World 程序

2、运算符丰富

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

3、数据类型丰富

C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。

4、表达方式灵活实用

C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。

5、允许直接访问物理地址,对硬件进行操作

由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。

6、生成目标代码质量高,程序执行效率高

C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。

7、可移植性好

C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。

8、表达力强

C语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。

C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
有一个很严重的错误,你输入字符数组的两个
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数据只是输入的字符串的首字符对吧?这个调试的过程中可以看到(今天刚学的调试程序)。

追答

呵呵呵,是这样的

追问

呵呵,谢谢您的帮助,可以交个朋友吗?282685900

本回答被提问者采纳
相似回答