1

我试图用来scanf_s()读取多个值,但每次运行程序时,我都会得到

实验室 2.exe 中 0x592AD6AC (msvcr120d.dll) 处的未处理异常: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)
4

2 回答 2

4

您没有提供长度指示器。来自 MSDN:

与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 需要为类型 c、C、s、S 或包含在 [] 中的字符串控制集的所有输入参数指定缓冲区大小。以字符为单位的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。例如,如果您正在读取一个字符串,则该字符串的缓冲区大小按如下方式传递: char s[10]; scanf_s("%9s", s, _countof(s)); // 缓冲区大小为 10,宽度规格为 9

是该页面的链接。

于 2014-08-07T01:31:16.040 回答
2

如果你真的想使用(不太便携)scanf_s,来自 C11 标准(n1570),Annex K 3.5.3.2 p.4:

fscanf_s函数等价于,fscanf除了c,s[转换说明符适用于一对参数(除非赋值抑制由 a 指示*)。这些参数中的第一个与 for 相同fscanf。该参数在参数列表中紧跟第二个参数,它具有类型rsize_t并给出数组中由该对的第一个参数指向的元素的数量。

你需要给出你的char *论点的长度:

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

或者,只需使用scanf

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

并且一如既往地检查返回值。

一般来说,scanf有时它对小型快速和肮脏的程序很有用,它对生产软件的用处较少,因为处理错误很困难。使用fgetsand sscanf/ strtod/ strtol/… 代替。

于 2014-08-07T01:39:50.943 回答