C:scanf()函数不工作,因为它应该
问题描述:
我遇到了scanf()
函数的问题。当我编译并运行此代码C:scanf()函数不工作,因为它应该
int ID;
char* name = NULL;
char sex;
float quiz1;
float quiz2;
float midscore;
float finalscore;
float totalscore;
printf("please enter the student information.\n");
printf("ID: ");
scanf("%i", &ID);
printf("Name: ");
scanf(" %s", name);
printf("Sex: ");
scanf(" %c", &sex);
printf("Quiz mark(first semester): ");
scanf(" %f", &quiz1);
printf("Quiz mark(second semester): ");
scanf(" %f", &quiz2);
printf("Mid-term score: ");
scanf(" %f", &midscore);
printf("Final score: ");
scanf(" %f", &finalscore);
printf("Total score: ");
scanf(" %f", &totalscore);
我得到的是:
ID:5
名:Alex
性别:测验标志(第一学期):测验标志(第二学期) :中期得分:最终得分:总得分:
有人能解释我发生了什么事吗?
答
在的
scanf(" %s", name);
name
点是NULL(即,它指向无效的内存位置),并使用该作为参数调用%s
undefined behavior。
您需要先分配内存到name
,然后才能使用它来保存输入。
答
这里的问题是:
char* name = NULL;
你需要写任何数据之前分配一些内存的指针。您可以静态或动态分配一些空间:
char name[10];
char *name2;
name2 = malloc(10*sizeof(char));
当调用'scanf()'函数族时,总是检查返回值(而不是参数值)以确保操作成功。当使用'%s'输入/转换说明符时,请始终使用比输入缓冲区长度小1的'最大长度'修饰符,以便用户不能超出输入缓冲区。请记住,这些输入中的每一个都是用一个换行字符序列结尾的。 '%s'在处理空白方面存在问题。并且'%c'将从前一个输入中输入换行符,这些中的每一个都可以通过使用格式字符串中的前导空格来修复。例如, – user3629249