本帖最后由 fc1735 于 2016-11-15 23:28 编辑
我也觉得很奇怪,在内存中name[256]在height的后面,如果是name[256]在height的前面就不会影响
#include <stdio.h>
int main(){
char name[256];
unsigned char height; //用1个byte来存放数字(0~255)
float mass;
printf("请输入您的姓名:");
scanf("%s", name);
printf("请输入您的身高(cm)");
scanf("%u",&height); //%u为4个字节,放到height的地址处,数值在256内时,第一个byte存放其数值,后面3个byte均存放0,但后面的地址是前面的name[0] ,name[1],name[2]的内容,故原本输入的名字被0即空字符覆盖掉了
printf("请输入您的体重(kg)");
scanf("%f",&mass);
printf("%s的身高为%.2f(in),体重为%.2f(lb)",name,height/30.48*12,mass*2.2046); //name[0]为空字符,即返回。
return 0;
}
解决办法是先输入身高再输入姓名,就不会被覆盖,但前提是你知道内存中排列的顺序,所以这样写的话,虽然省了3个byte去存放数值,但在不知道存放顺序的情况下,要运行完或反编译之后再来修正原代码
另外正确的scanf 字符参数,要把输入的无符号数值以一个byte存放的话 是%hhu 这样就不会越界覆盖到name[0]~name[2]的位置
鱼币 |