• scanf和scanf_s函数详解


    目录

    引言:

    1.scanf函数的用法:

    2.scanf_s函数的用法:

    3.scanf和scanf_s的区别:

    结论:


    引言:

    在C语言中,输入函数scanf是非常常用的函数之一,它可以从标准输入流中读取数据并将其存储到指定的变量中。然而,由于scanf存在一些安全性问题,Microsoft C编译器引入了scanf_s函数来解决这些问题。

    1.scanf函数的用法:

    scanf函数的原型如下:

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

     它的参数format是一个字符串,用于指定输入的格式,而...表示可以接受任意数量的变量。

    例:

    1. #include
    2. int main()
    3. {
    4. int num;
    5. printf("请输入一个整数:");
    6. scanf("%d", &num);
    7. printf("您输入的整数是:%d\n", num);
    8. return 0;
    9. }

    在上面的示例中,%d是格式控制符,用于指定输入的数据类型为整数。&num表示输入的整数存储到num中。

    2.scanf_s函数的用法:

    scanf_s函数的原型如下:

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

    scanf函数相比,scanf_s函数多了一个参数用于指定读取的最大字符数。这个参数是为了防止缓冲区溢出而引入的,可以有效地防止一些安全性问题。

    例:

    1. #include
    2. int main()
    3. {
    4. char str[100];
    5. printf("请输入一个字符串:");
    6. scanf_s("%s", str, sizeof(str));
    7. printf("您输入的字符串是:%s\n", str);
    8. return 0;
    9. }

    在上面的示例中,%s是格式控制符,用于指定输入的数据类型为字符串。str表示将输入的字符串存储到字符数组str中。sizeof(str)表示str的最大字符数,以确保输入的字符串不会导致缓冲区溢出。

    3.scanfscanf_s的区别:

    • scanf函数在读取字符串时,如果输入的字符串长度超过了目标变量的大小,会导致缓冲区溢出,从而引发安全性问题。而scanf_s函数通过添加一个参数来指定读取的最大字符数,可以避免这个问题。
    • scanf_s函数在读取字符串时,要求输入的字符必须以空字符'\0'结尾。如果输入的字符串没有以'\0'结尾,scanf_s函数会返回一个错误码,并且不会将任何字符存储到目标变量中。
    • 两者主要是输入字符字符串时有所区别。

    1. #include
    2. int main()
    3. {
    4. char arr[20] = { 0 };
    5. char ch = 0;
    6. //读取一个字符
    7. //第三个参数决定读取一个字符
    8. scanf_s("%c", &ch, 1);
    9. printf("%c\n", ch);
    10. return 0;
    11. }

     


    1. #include
    2. int main()
    3. {
    4. char arr[20] = { 0 };
    5. //读取一个字符串
    6. //第3个参数指定了读取字符的个数,实际读取19个,最后一个放\0
    7. scanf_s("%s", arr, 20);
    8. printf("%s\n", arr);
    9. return 0;
    10. }

    结论:

    在C语言中 ,输入函数scanfscanf_s都可以用于从标准输入读取数据,然而,为了提高程序的安全性,推荐使用scanf_s函数,并在读取字符串时指定最大字符数,以避免缓冲区溢出的问题。

  • 相关阅读:
    Centos7下安装MySQL详细步骤
    Android 12.0 Launcher3定制化功能之抽屉式(双层)app列表排序功能实现
    计算机组成原理---第三章存储系统---主存储器和CPU的连接
    springboot集成mapstruct快速上手使用【实现DTO和实体间的相互转换】
    微服务架构之:Redis的分布式锁---搭建生产可用的Redis分布式锁
    使用D435i+Avia跑Fast-LIVO
    字符串定义
    数据结构与算法(07)之数组与字符串解法(双指针,快慢指针,哈希表,KMP算法等)
    数组清空(bzero与memset)
    暑期JAVA学习(44)注解
  • 原文地址:https://blog.csdn.net/weixin_65931202/article/details/132742061