为什么格式不匹配时scanf返回随机值
#include <stdio.h>
int main() {
int i,j,k;
scanf("%d %d %d",&i,&j,&k);
printf("%d %d %d", i, j, k);
return 0;
}
输入“5 .5 .5”后,返回值为“5 -6229899888 32765”。这个返回值背后的原因是什么?这里究竟发生了什么?(当然,除了前 5 个,那是正常匹配的)。
回答
当scanf匹配输入文本时,它根据转换规范对其进行转换(例如将十进制解释为%d)并将结果分配给相应参数所指向的对象。
当scanf不匹配时,它不进行分配。
然后相应对象中的值scanf就是调用之前的值。如果您没有将值放入其中(通过初始化或赋值),则其“值”是不确定的。1有时,它似乎具有的价值是早期软件将同一内存用于不同目的而在内存中留下的任何值。
脚注
1当C 标准定义的值不确定时,编译器不需要为其值使用分配的内存。允许优化删除任何可能获取其值的内存负载,因此程序可以继续处理某个寄存器或其他寄存器中的任何数据,并且程序代码中的位置可能会有所不同。这可能会导致不确定值在不同时间看起来不同。
回答
您需要检查的返回值 scanf()
#include <stdio.h>
int main(void) {
int i, j, k;
int check = scanf("%d%d%d", &i, &j, &k);
switch (check) {
default: printf("errorn"); break;
case 0: printf("no valuesn"); break;
case 1: printf("%dn", i); break;
case 2: printf("%d %dn", i, j); break;
case 3: printf("%d %d %dn", i, j, k); break;
}
return 0;
}