这是一个较易被初学者弄晕的一个坑。
先看看scanf的相关知识,scanf的格式为:
scanf(格式控制, 地址列表)
关于格式控制,scanf允许以"%d, %d, %d"与"%d%d%d"格式,初学的时候,我们常常直接使用,却没有去深究过这两种格式有什么差别。
在C中,对于"%d%d"和"%d, %d"两种输入格式的差别:
(1)在输出方面,若这两种变量存放的值是123和456为例,即
int t1 = 123;
int t2 = 456;
①printf("%d%d", t1, t2);
②printf("%d, %d",t1, t2);
相应输出的是:
①123456
②123,456
输出的格式与printf的格式有关,与scanf 的输入格式无关。
(2)在输入方面,
1>用"%d%d"输入时,没有指定输入的间隔,这是凡是不可见字符,包括空格" “,制表符” “(tab键)或”\t",换行符(回车键)或"\n",均可作为输入的分隔。
如scanf("%d%d", &t1, &t2);输入1和2时,
可以:1\t2, 也可以:1\n2
2>用"%d, %d"输入时,限定格式必须为以逗号分隔,即当输入完第一个数后,必须紧跟一个逗号,否则输入会出错。需说明的是,此格式只限定一个数字后必须为逗号,而逗号和第二个数字之间是否存在不可见字符并没有要求。
即:123,456\n或123, 456\n都正确
但123 ,456则错误。
而一个坑在scanf在输入包含数组或者字符串时,比如此时要用一个scanf语句同时对三个变量(包括int型,char数组,int型)赋值,以分别输入“10,china,30”为例,若以
int t1;
char t2[10];
int t3;
scanf("%d, %s, %d",&t1,&t2,&t3);
printf("%d,%s,%d",t1,t2,t3);
按此格式输入为:
10,china,30
但输出为:
10,china,30,0
好好地怎么多出一个0?期初我还以为是数组未填满造成的,后来证实这并不影响。通过查阅资料与多次验证,终于发现问题出在了数组,即用这种格式时,用逗号隔开**,逗号被数组认作字符连同第三个int型变量一并读入数组内**,导致第三个变量并没有被赋值,最后导致不符合要求。
如果用"%d%s%d"格式输入,则不存在此问题。在此格式下,输入时以空格、Enter键、Tab键为分隔,使得数组与整型自行分开。即
输入:
10 china 30 或 10\nchina\n30 或 10\tchina\t30
输出为:
10,china,30
总的来讲,这是scanf的分隔符输入与数组的冲突。