首页 > C语言笔记

C语言scanf_s()和scanf()有什么区别?

在C语言编程中,输入函数是我们与用户交互的重要工具,scanf() 和 scanf_s() 都是用于读取用户输入的函数,但它们之间存在一些关键的区别。
 

scanf() 是C语言中传统的输入函数,它被广泛使用于读取各种格式的数据,这个函数可以读取整数、浮点数、字符和字符串等多种数据类型。以下是 scanf() 的基本语法:

int scanf(const char *format, ...);

使用 scanf() 的一个简单例子:

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    printf("你输入的整数是:%d\n", num);
    return 0;
}

运行结果可能如下:

请输入一个整数:42
你输入的整数是:42

虽然 scanf() 使用方便,但它存在潜在的安全风险,特别是在读取字符串时,如果用户输入的数据超过了分配的缓冲区大小,就可能导致缓冲区溢出,这是一个严重的安全漏洞。

scanf_s() 函数

为了解决 scanf() 的安全问题,Microsoft 在其 C 运行时库中引入了 scanf_s() 函数,这个函数提供了更安全的输入处理机制。scanf_s() 的基本语法如下:

int scanf_s(const char *format, ...);

使用 scanf_s() 的一个例子:

#include <stdio.h>

int main() {
    int num;
    char str[10];
    printf("请输入一个整数和一个字符串:");
    scanf_s("%d %9s", &num, str, (unsigned)_countof(str));
    printf("你输入的整数是:%d\n", num);
    printf("你输入的字符串是:%s\n", str);
    return 0;
}

运行结果可能如下:

请输入一个整数和一个字符串:42 hello
你输入的整数是:42
你输入的字符串是:hello

主要区别

scanf_s() 和 scanf() 的主要区别在于:


虽然 scanf_s() 提供了更高的安全性,但它并不是跨平台的解决方案,对于需要在多个平台上运行的程序,我们可以采用其他安全的输入方法,比如使用 fgets() 函数读取字符串,然后用 sscanf() 解析数据:

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[100];
    int num;
    char str[10];

    printf("请输入一个整数和一个字符串:");
    if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        if (sscanf(buffer, "%d %9s", &num, str) == 2) {
            printf("你输入的整数是:%d\n", num);
            printf("你输入的字符串是:%s\n", str);
        } else {
            printf("输入格式错误\n");
        }
    }
    return 0;
}

这种方法既安全又具有良好的可移植性,是一种推荐的编程实践。


理解 scanf() 和 scanf_s() 的区别,以及如何安全地处理用户输入,是C语言编程中的重要技能。

相关文章