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

本回答被提问者采纳

C语言中利用scanf语句输入多个值的问题
scanf("%s",person[i].category.position);3、其他的也没有什么错误,记着输入时候,那几个值之间用一个空格隔开,用scanf()函数输入的时候,本质是,你给scanf一个地址,这个函数会根据你输入的地址把,输入缓冲区中的数据放在指定地址处 4、像int ,char,double,long,float这些基本类型,再分配...

怎么用C语言的scanf实现一次输入若干个数据
这里我们先建一个固定长度的数组,如下图,数组长度为1000 然后就需要用到循环了,并且设置一个按键“回车键”跳出循环。这样,不断循环就可以不断地将数字存进数组里。当我们按回车键的时候就会跳出循环,结束输入。而输入的数据就会保存在num数组之中,唯一的缺点就是数组长度是固定的。

C语言用scanf语句 输入几个数值时,数值之间用什么隔开
scanf输入数值时,需要按照scanf格式参数的定义来决定数值之间用什么隔离。譬如 scanf("%d,%d", &a, &b); 输入两个数之间必须有一个逗号 scanf("%d&%d", &a, &b); 输入两个数之间必须有一个&号 如果没有特别指明分隔符号,默认是空格或回车。

C语言笔记-040 scanf用法3 一次给多个变量键盘赋值
键盘复制多个变量可通过一次使用scanf函数,获取多个变量值,这被称为"键盘复制"。例如同时获取s、t、d、h、i、t、u、r、n变量。输入和输出时取地址符使用规则需注意。在输入时必须使用取地址符(&),而输出时则无需使用。若忘记写取地址符,编译器会报错。连续数字字符被视为一个数字处理。如"12...

c语言中,用scanf语句输入多个数据的时候,数据之间是用什么符号间隔开的...
example:scanf("%d%d%d",&a,&b,&c);你在屏幕中输入时可以这样 1 2 3 也可以这样:1 2 3

我用C语言scanf输入2个数字是怎么只能收到一个
1、scanf("%d,%d",&a,&b);按照这个格式,输入数据的时候,应该加上逗号。比如说想输入22 33 就应该 22,33。2、也可以像这样scanf("%d %d",&a,&b);中间用空格隔开,那样就可以直接输入 22 33了。scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。该函数的原型为:include...

怎么用C语言的scanf实现一次输入若干个数据
int a[15],i;for(i=0;i<15;++i)scanf("%d",&a[i]);

c语言用scanf输入多个字符的问题
先把输入的数据存放在缓冲区,再在执行getchar的时候一个一个的取出来,执行while语句,当取到'#'时,就跳出循环;输出结果.

c语言中用scanf连续输入多个字符串的数据会重复为什么
问题出在以下定义:char name[6];char number[18];char phone[11];char year[4];char month[2];char day[2];字符数组name只能存储长度为5的字符串,因为结尾还有一个\\0,而你的输入已经越界了,后面输入的内容将前面的\\0覆盖,导致字符串输出异常,其他5个情况类似。

c语言中,如果用scanf输入多个数字,每个数字之间在输入的时候能用逗号...
scanf("%d,%d",&a,&b); \/\/这种输入的时候逗号隔开 scanf("%d%d",&a,&b); \/\/这种输入的时候不需要逗号隔开,空格或tab或回车隔开就行

相似回答