我尝试使用scanf_s()
读取多个值,但每次运行程序时,我都会
实验室中的0x592AD6AC(msvcr120d.dll)处的未处理异常2.exe:0xC0000005:访问冲突写入位置0x00000000。
在弹出窗口中。我该如何解决这个问题?
float inTemp;
char inUnit;
char outUnit;
printf("Please enter the starting temperature with its units and the units\nyou would like to convert to (i.e. 74.5 F C): ");
scanf_s("%f %c %c", &inTemp, &inUnit, &outUnit); //takes in all user input (NOT WORKING)
答案 0 :(得分:4)
您尚未提供长度指示器。来自MSDN:
与scanf和wscanf不同,scanf_s和wscanf_s需要缓冲区大小 要为c,C,s,S或string类型的所有输入参数指定 包含在[]中的控件集。缓冲区大小以字符为单位 在指针指向后立即作为附加参数传递 缓冲区或变量。例如,如果您正在读取字符串,则 该字符串的缓冲区大小传递如下:char s [10]; scanf_s(“%9s”,s,_countof(s)); //缓冲区大小为10,宽度 规格是9
Here是该页面的链接。
答案 1 :(得分:2)
如果你真的想使用(不太便携)scanf_s
,请遵守C11标准(n1570),附件K 3.5.3.2第4页:
fscanf_s
函数等同于fscanf
,但c
,s
和[
转换说明符适用于一对参数(除非赋值)抑制由*
表示。这些参数中的第一个与fscanf
相同。该参数在参数列表中紧跟第二个参数,其类型为rsize_t
,并给出该对的第一个参数指向的数组中的元素数。
您需要提供char *
参数的长度:
scanf_s("%f %c %c", &inTemp, &inUnit, 1, &outUnit, 1);
或者,只需使用scanf
:
scanf("%f %c %c", &inTemp, &inUnit, &outUnit);
并且,与往常一样,检查返回值。
一般来说,由于scanf
对于快速而肮脏的程序来说很有用,因此对于高效的软件来说它的用处较少,因为处理错误很难。请改用fgets
和sscanf
/ strtod
/ strtol
/ ....