如何定义SCANF以成为以后的安全函数scanf_s()?

问题描述 投票:0回答:1

我被布置了作业,需要编写一个 C 程序,该程序首先从用户那里读取两个浮点数。如果您的编译器支持安全函数,我需要使用 scanf_s() 函数进行读入,并使用 #if ...#else ...#endif 指令。 作业表说我必须将 SCANF 定义为以后的安全函数 scanf_s() 并添加 else 部分以将 SCANF 定义为标准函数 scanf(),但我不太明白这意味着什么。有人可以向我解释一下吗?

我只是不明白问题陈述的含义。

c scanf
1个回答
0
投票

您将被指示使用预处理器指令有条件地定义一个文本替换宏,将标记

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.