用法介绍scanf_s函数的用法(scanf与scanf)

一、什么是scanf_s函数

scanf_s函数是C语言中的输入函数之一,其作用是从标准输入流(例如键盘)中读取数据,并将读取的数据存储到指定的变量中。scanf_s函数与其他输入函数相比,具有更强的安全性,可避免缓冲区溢出的风险。

二、scanf_s函数的基本用法

scanf_s函数的基本格式如下:

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

其中,format是一个C格式字符串,用于指定如何读取输入数据;省略号(…)表示可以传入任意数量和类型的参数,这些参数会与格式字符串中的占位符一一对应。

scanf_s函数的返回值是成功读取的数据项数量,如果在读取过程中出现错误或到达输入流的结尾,则返回-1。

下面是一个示例程序,演示了scanf_s函数的基本用法:

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个整数:");
    scanf_s("%d", &num);//从键盘读取一个整数
    printf("你输入的整数是:%dn", num);//输出读取的整数
    return 0;
}

三、scanf_s函数的格式控制字符串

scanf_s函数的格式控制字符串用于指定输入数据的类型和格式。在格式控制字符串中,有一些特殊字符和占位符,它们分别表示不同的含义。

1. %c:读取一个字符

下面是一个示例程序,演示了如何使用%c格式控制字符串从标准输入流中读取一个字符:

#include <stdio.h>
int main()
{
    char ch;
    printf("请输入一个字符:");
    scanf_s("%c", &ch);//从键盘读取一个字符
    printf("你输入的字符是:%cn", ch);//输出读取的字符
    return 0;
}

2. %s:读取一个字符串

下面是一个示例程序,演示了如何使用%s格式控制字符串从标准输入流中读取一个字符串:

#include <stdio.h>
int main()
{
    char str[50];
    printf("请输入一个字符串:");
    scanf_s("%s", str, 50);//从键盘读取一个字符串
    printf("你输入的字符串是:%sn", str);//输出读取的字符串
    return 0;
}

3. %d、%i、%o、%x、%X:读取一个整数

下面是一个示例程序,演示了如何使用%d格式控制字符串从标准输入流中读取一个整数:

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个整数:");
    scanf_s("%d", &num);//从键盘读取一个整数
    printf("你输入的整数是:%dn", num);//输出读取的整数
    return 0;
}

除了%d以外,scanf_s函数还支持其他几种整数格式控制字符串:

  • %i:可以读取十进制、八进制、十六进制表示的整数。例如,输入字符串”100″会被解释为十进制整数100,输入字符串”0100″会被解释为八进制整数64,输入字符串”0x100″会被解释为十六进制整数256。
  • %o:读取一个八进制表示的整数。例如,输入字符串”100″会被解释为八进制整数64。
  • %x:读取一个十六进制表示的整数。例如,输入字符串”100″会被解释为十六进制整数256。
  • %X:与%x类似,但读取的整数是大写形式的十六进制表示。

4. %f、%e、%E、%g、%G:读取一个浮点数

下面是一个示例程序,演示了如何使用%f格式控制字符串从标准输入流中读取一个浮点数:

#include <stdio.h>
int main()
{
    float num;
    printf("请输入一个浮点数:");
    scanf_s("%f", &num);//从键盘读取一个浮点数
    printf("你输入的浮点数是:%fn", num);//输出读取的浮点数
    return 0;
}

除了%f以外,scanf_s函数还支持其他几种浮点数格式控制字符串:

  • %e、%E:读取一个科学计数法表示的浮点数。例如,输入字符串”1.23e2″会被解释为浮点数123.0。
  • %g、%G:根据精度自动选择%f或%e/%E格式控制字符串。例如,如果读取到的浮点数是12.345,如果精度<=7,则会输出"12.345",否则输出"1.2345e+01"。

四、scanf_s函数的安全性控制

scanf_s函数具有更强的安全性,因为它会进行一些安全性控制,从而避免缓冲区溢出等错误。主要的安全性控制有以下几个方面:

1. 指定读取数据的最大长度

scanf_s函数允许指定读取数据的最大长度。例如,在读取一个字符串时,可以指定缓冲区的最大长度,从而避免数据溢出。下面是一个示例程序,演示了如何通过限制最大长度来保证scanf_s函数的安全性:

#include <stdio.h>
#define MAX_LEN 50
int main()
{
    char str[MAX_LEN];
    printf("请输入一个字符串:");
    scanf_s("%s", str, MAX_LEN);//从键盘读取一个字符串,并指定最大长度
    printf("你输入的字符串是:%sn", str);//输出读取的字符串
    return 0;
}

2. 检查读取数据的长度

scanf_s函数会检查读取数据的长度,如果读取的数据长度超过了缓冲区的最大长度,则会截断多余的数据或返回错误。

下面是一个示例程序,演示了如何通过检查读取数据的长度来保证scanf_s函数的安全性:

#include <stdio.h>
void SafeScanf(char* str, int maxLen)
{
    int count = scanf_s("%s", str, maxLen);//从键盘读取一个字符串,并指定最大长度
    if (count == -1)
    {
        printf("读取错误或到达输入流的结尾!n");
    }
    else if (count == maxLen)
    {
        printf("输入的字符串过长,已被截断!n");
    }
    else
    {
        printf("你输入的字符串是:%sn", str);//输出读取的字符串
    }
}
int main()
{
    char str[20];
    printf("请输入一个字符串:");
    SafeScanf(str, 20);
    return 0;
}

3. 使用格式指定辅助符

scanf_s函数还支持使用格式指定辅助符,用于限制读取数据的长度和类型。下面是一个示例程序,演示了如何使用格式指定辅助符来保证scanf_s函数的安全性:

#include <stdio.h>
int main()
{
    char str[50];
    printf("请输入一个最多包含20个字符的字符串:");
    scanf_s("%20s", str, 50);//从键盘读取一个最多包含20个字符的字符串
    printf("你输入的字符串是:%sn", str);//输出读取的字符串
    return 0;
}

五、scanf_s函数的错误处理

scanf_s函数在读取输入数据过程中,可能会出现一些错误。主要的错误类型有以下几种:

1. 输入数据与格式字符串不匹配

如果输入数据的类型、格式与格式字符串不匹配,则scanf_s函数会返回错误。下面是一个示例程序,演示了如何处理输入数据与格式字符串不匹配的错误:

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个整数:");
    while (scanf_s("%d", &num) != 1)//从键盘读取一个整数,并检查是否读取成功
    {
        printf("输入错误,请重新输入一个整数:");
        while (getchar() != 'n');//清空输入缓冲区
    }
    printf("你输入的整数是:%dn", num);//输出读取的整数
    return 0;
}

2. 数据读取错误或到达输入流的结尾

如果输入数据读取错误或到达输入流的结尾,则scanf_s函数会返回-1。下面是一个示例程序,演示了如何处理数据读取错误或到达输入流的结尾的错误:

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个整数:");
    if (scanf_s("%d", &num) == -1)//从键盘读取一个整数,并检查返回值
    {
        printf("读取错误或到达输入流的结尾!n");
    }
    else
    {
        printf("你输入的整数是:%dn", num);//输出读取的整数
    }
    return 0;
}

3. 缓冲区溢出

由于scanf_s函数具有更强的安全性,因此可以避免缓冲区溢出等错误。下面是一个示例程序,演示了如何处理缓冲区溢出的错误:

#include <stdio.h>
#define MAX_LEN 50
int main()
{
    char str[MAX_LEN];
    printf("请输入一个最多包含20个字符的字符串:");
    if (scanf_s("%20s", str, MAX_LEN) == -1)//从键盘读取一个最多包含20个字符的字符串,并检查是否读取成功
    {
        printf("读取错误或到达输入流的结尾!n");
    }
    else
    {
        printf("你输入的字符串是:%sn", str);//输出读取的字符串
    }
    return 0;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平