我正在尝试编写这个简单的程序,它在一个scanf函数中读取多个变量但输入输入后会抛出异常?
编辑:我最初使用了scanf,但是它会导致错误,说它可能不安全。
抛出异常:
Program.exe中的0x52DAB87C(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0x00D00000
#include <stdio.h>
#include <stdlib.h>
void main()
{
char name[20];
int age;
char gender;
float income;
printf("Enter <name> <age> <gender> <income> :");
scanf_s("%s %d %c %f", &name, &age, &gender, &income);
printf("Name : %s", name);
printf("Age : %d", age);
printf("Gender : %c", gender);
printf("Income : %.2f", income);
system("pause");
}
答案 0 :(得分:6)
%s
/ scanf
的{{1}}格式说明符需要指向char数组的第一个元素的指针,即scanf_s
。相反,您传入的是数组的地址,在本例中为char *
。这些类型是不兼容的。为格式说明符传递错误的类型会调用https://jsfiddle.net/f79vj0s3/。
传递char (*)[20]
而不是传入&name
。传递给函数时,数组会衰减到指向第一个元素的指针,因此这是正确的类型。
name
另请注意给定的长度说明符,它限制了可以读取的字符数,因此它不会尝试写入数组的末尾。