帮忙看一下一道C语言填空题

来源:百度知道 编辑:UC知道 时间:2024/05/06 00:33:49
以下程序运行时若从键盘上输入:10 20 30<回车>,输出结果是什么?
#include<stdio.h>
main()
{int i=0,j=0,k=0;
scanf("%d%*d%d",&i,&j,&k);
printf("%d%d%d",i,j,k);
}
答案是10300,不过我不知是怎么算的

scanf("%d%*d%d",&i,&j,&k); 中的*号本没有错,C中就是有这个的.表示跳过一个输入.所以j 赋过的值不是20,而是30了.因为跳过了一个嘛.而k 就没有赋值.所以还是0
用printf("%d%d%d",i,j,k); 输出的时候,i为10j为30,k为0输出语句的原因,所以输出是连续的了.在printf中加些空格就可以了.这些数就不会连在一起了.

输出102030,因为printf函数中的格式控制符%d中间没有空格,所以它会接连输出三个数.

结果应该不是10300吧,在C中"*"是输入赋值抑制字符,表示该格式说明要求输入数据,但不赋值,也就是在地址列表中没有相对应的地址项.

scanf("%d%*d%d",&i,&j,&k); 中的
%*d因为格式错误,导致第二个数的数值
20并没有被&j的地址收到,&j的地址收到
的是第三个数30,而&k的地址保存的
是原来的数值0,把三个数连续输出不是
10300么?你把最后一句改为;
printf("%d,%d,%d",i,j,k);
就可以知道三个数的数值了.

楼上看下MSDN中的这段,你还认为%*d是格式错误吗?An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

上机测试的结果的确是10300,如smaily521所说%*d是一个抑制输入的操作,也就是这个%*d是用来占位的(不知道这样说是否准确,请达人指点)。20的确被扫描进内存了但是scanf并没有把它赋给任何变量(看下这句:The field is scanned but not stored.)。后面的30被做为第二个数赋给了j,因为已经达到了预先设定的输入数,所以k没有得到赋值。<