我遇到多个字符和scanf_s()的问题

时间:2014-08-07 01:22:09

标签: c visual-studio scanf unhandled-exception tr24731

我尝试使用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)

2 个答案:

答案 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,但cs[转换说明符适用于一对参数(除非赋值)抑制由*表示。这些参数中的第一个与fscanf相同。该参数在参数列表中紧跟第二个参数,其类型为rsize_t,并给出该对的第一个参数指向的数组中的元素数。

您需要提供char *参数的长度:

scanf_s("%f %c %c", &inTemp, &inUnit, 1, &outUnit, 1);

或者,只需使用scanf

scanf("%f %c %c", &inTemp, &inUnit, &outUnit);

并且,与往常一样,检查返回值。

一般来说,由于scanf对于快速而肮脏的程序来说很有用,因此对于高效的软件来说它的用处较少,因为处理错误很难。请改用fgetssscanf / strtod / strtol / ....