我被布置了作业,需要编写一个 C 程序,该程序首先从用户那里读取两个浮点数。如果您的编译器支持安全函数,我需要使用 scanf_s() 函数进行读入,并使用 #if ...#else ...#endif 指令。 作业表说我必须将 SCANF 定义为以后的安全函数 scanf_s() 并添加 else 部分以将 SCANF 定义为标准函数 scanf(),但我不太明白这意味着什么。有人可以向我解释一下吗?
我只是不明白问题陈述的含义。
您将被指示使用预处理器指令来有条件地定义一个文本替换宏,将标记
SCANF
替换为scanf_s
或scanf
,具体取决于前者的可用性。
请注意,以下内容通常是一个糟糕的想法,因为
scanf
和 scanf_s
接受的变量参数有很大不同,具体取决于所使用的格式说明符。下面我们只使用 %f
,这两个函数的作用恰好相同。例如,在下面的程序中使用 %s
将调用 未定义行为。
来自有关
scanf_s
的一些文档:
与所有边界检查函数一样,仅当
由实现定义并且用户将scanf_s
定义为整数常量fscanf_s
sscanf_s
时,才能保证__STDC_LIB_EXT1__
、__STDC_WANT_LIB_EXT1__
和1
可用。在包含之前。<stdio.h>
#if defined(STDC_LIB_EXT1) || defined(MSC_VER)
#define __STDC_WANT_LIB_EXT1 1
#define SCANF scanf_s
#else
#define SCANF scanf
#endif
#include <stdio.h>
int main(void)
{
float a, b;
printf("Enter two floating-point numbers: ");
if (2 != SCANF("%f%f", &a, &b)) {
fputs("Could not read input.\n", stderr);
return 1;
}
printf("Got: [%.2f], [%.2f]\n", a, b);
}