链表当中的一个元素,代表学生的性别,为什么不能定义成char,非要定义char数组?

来源:百度知道 编辑:UC知道 时间:2024/06/17 19:44:25
建立链表,每个结点包括学号,姓名,性别,年令.我是这样定义结构体的:
struct student
{long num;
char name[10];
char sex;
int age;
struct student *next;
};
在输入时我采用如下方法:
scanf("%ld%s%c%d"..............);
可以,输入到sex元素的时候,电脑就开始叫唤,出现一片乱码.我输入的只是一个字母啊,我换了一种方法,把sex定义成数组,char sex[2],输入时按%s输入,一切就顺利了,我想知道这是为什么.我想,我输入的只是一个字母,并不是字符串,所以后面也牵扯不到\0的问题啊,很迷茫,请高手指点下.多谢.
楼下的回答我没看懂.我的输入情况如下:(↙代表enter)
1001↙
zhang↙
f↙输到这儿就开始叫唤,出现乱码.

解决这个问题需要理解C库函数scanf怎样处理输入的。
当函数在格式串中遇到%s时,函数将从标准输入中依次读入字符,直到遇到以下几个结束符号之一便停止:空格符、TAB、换行符及输入结束符。
当函数在格式串中遇到%c时,函数将从标准输入中读入单个字符。
现在来看看你给出的代码片段:scanf("%ld%s%c%d"..............);
格式串中%s%c的组合将导致读入的单个字符为上述读入字符串之后的结束符号。

针对问题补充的回答。
1、如果输入“1001↙
zhang↙
f↙”
那么,1001对应%ld,zhang对应%s,而紧随zhang后面的“↙”对应%c,f对应%d。
2、出现“叫唤”及“乱码”,应该是由于输出上述读入的结果时造成的。

可能是读了name后面的一个分隔符(就是你从键盘输入的'tab','space'之类的)付给sex,所以出错啦。