适合初学者的scanf函数讲解

1.1 scanf函数的介绍

  • scanf函数定义在C语言标准库<stdio.h>中,基本形式如下

    int scanf(const char *format, ...);
  • const char *format: 这是一个字符串,称为“格式控制字符串”,它包含了用来解释输入数据的格式说明符。格式字符串决定了scanf()函数如何解析输入流中的数据。

  • ...: 这是一个变长参数列表,它包含了要存储输入数据的变量地址。这些变量将按照格式字符串中指定的顺序接收输入。

  • 功能: 用于从键盘上接受指定格式的数据,并把数据存到指定的存储单元

  • 返回值: 正常,返回输入数据个数

  • 地址表:变量的地址,常用取地址运算符&,数组不用&

1.2与getchar函数  fgets函数的区别

  • getchar():这个函数每次读取一个字符,通常用于从标准输入(如键盘)获取单个字符。,getchar() 函数默认是可以读取任何字符,包括回车键,通常他也用来读取多个scanf输入时的回车键.

  • fgets()的最初的样子    char *fgets(char *str, int num, FILE *stream);

  • 参数说明:

    • str: 字符串的起始地址,通常是一个字符数组(或字符串)的指针。
    • num: 要读取的最大字符数(包括终止符 '\0' 在内)。注意,fgets() 不会读取超过 num-1 的字符,以确保字符串以 '\0' 结尾。
    • stream: 文件流,通常是标准输入 stdin 或者打开的文件。
  • scanf():这个函数可以读取多个数据,包括字符串、整数、浮点数等,并能处理空白字符作为字段之间的分隔符。它的格式化输入能力让它能够根据你提供的格式控制字符串来解析输入。

  • getchar()没有格式化选项,它只返回一个字符。

  • scanf()需要一个格式化字符串,你可以指定期望的数据类型,例如"%d"用于整数,"%s"用于字符串。

  • scanf与 fgets的区别

  • 处理空白字符:

    • fgets() 保留输入中的空白字符(例如空格和制表符)。
    • scanf() 默认跳过空白字符,除非格式字符串中明确包含它们。
  • 格式控制:

    • fgets() 没有格式控制;它简单地读取字符直到遇到换行符或达到指定的字符数量。
    • scanf() 允许使用格式化字符串来精确控制如何读取输入。。
  • 行为差异:

    • fgets() 总是读取完整的行,而 scanf() 则根据提供的格式字符串来读取输入。

2.1 scanf的使用

  • 首先介绍一下scanf支持的格式字符,比如:

格式符号作用
i,d十进制整数
x,X十六进制无符号整数
o八进制无符号整数
u无符号十进制整数
c对于 %c 格式说明符,它确实会读取单个字符,包括空格和制表符等空白字符。这意味着如果你使用 %c 来读取输入,那么空格也会被当作有效的输入字符读取。
s读取一系列非空白字符到一个字符数组中。当 scanf() 遇到空白字符(如空格、制表符或换行符)时,它会停止读取并将读取到的字符串存储到指定的字符数组中
e指数形式附浮点小数
f小数形式浮点小数

scanf函数支持的说明符可以带以下修饰符

修饰符功能
h用于d,o,x前,指定输入为short型整数
I用于d,o,x前,指定输入为long型整数
I用于e,f前,指定输入为double型实数
m指定输入数据宽度,遇到空格或不可转换字符结束
*抑制符,指定输入项读入后不赋给变量

比如你想在键盘上获取任意一个整数

int i = 0;  //首先定义一个 int类型变量
​
scanf("%d",&i);  //通过scanf函数或
​
printf("%d ",i);  //通过scanf函数打印出来
  • 接下来介绍一下scanf("%nd" )什么意思,n是一个整数,比如scanf("%4d" )

    scanf("%4d%2d%2d",&aa,&bb,&cc);
        若输入19991225
        则aa为1999,bb为12,cc为25
  • 顺便在介绍一下 *抑制符的使用

  • %*3d 将读取接下来的三个非空白字符3 4 5,但因为有抑制符*的存在,这三个字符会被读取但不会存储到任何变量中。这同时意味着scanf将会跳过输入中的345以及它们之间的空格。

  • 最后,%2d将读取紧随其后的两个非空白字符67,并将它们作为一个两位的整数67存储到变量b中。

    scanf("%2d %*3d%2d",&a,&b);//*3表明
        若输入1234567
        则a为12,b为67

  • 接下来就是如何获取一段字符串了

int main()
{
    
    char lgk[5];    //定义一个字符串数组
    int i = 0;  
    scanf("%4s",lgk);  //因为数组名就是数组的首地址,所以说不用&
 for (i = 0; i < 4; i++) {
        if (lgk[i] == '\0') break;  // 检查是否到达字符串结束
        printf("%c ", lgk[i]);  // 打印字符
    }
    
}

2.2多个scanf的使用

  • 多个scanf函数的使用,关键在于回车键的消除,我们一般都用getchar函数去吸收回车键,或者%*c吸收.

        int s;
        char ch;
        scanf("%d",&s);
    //  getchar();//加入这个可以吸收回车,然后可以输入两次 
    //%*c也可以吸收 
        scanf(" %c",&ch);
        
        printf("%d\n",s);
        printf("%c",ch);
        return 0;
        

2.3有关scanf函数的考题

  • 题目1:处理多个输入值中的空格

    题目描述: 编写一个程序,要求用户输入两个整数,然后计算并输出它们的和。但是,程序应当能够正确处理用户在输入数字之间插入额外空格的情况。

    #include <stdio.h>
    ​
    int main() {
        int num1, num2;
        printf("Enter two integers separated by spaces: ");
        scanf("%d %d", &num1, &num2);
        printf("The sum is: %d\n", num1 + num2);
        return 0;
    }

  • 题目2:处理输入行尾的换行符

    题目描述: 编写一个程序,要求用户输入一个整数和一个浮点数,然后输出这两个数值。但是,程序应当能够正确处理在输入整数后按下的回车键(即换行符),并且不影响后续浮点数的读取。

    #include <stdio.h>
    ​
    int main() {
        int integer;
        double floating;
        
        printf("Enter an integer: ");
        scanf("%d", &integer);
        // 吸收输入缓冲区中的换行符
        getchar();
        
        printf("Enter a floating point number: ");
        scanf("%lf", &floating);
        
        printf("Integer: %d\n", integer);
        printf("Float: %.1f\n", floating);
        return 0;
    }

  • 题目3:处理字符串中的空格

    题目描述: 编写一个程序,要求用户输入一个名字和年龄,然后输出这个信息。但是,程序应当能够正确处理名字中包含空格的情况。在这里顺便介绍一下[^\n],这个字符他会让scanf函数一直读取键盘上输入的任意符号,包括空格,但是不包括回车键和换行符

    例如: LI NING

    #include <stdio.h>
    
    int main() {
        char name[100]; // 假设最多99个字符加上结束符
        int age;
    
        printf("Enter your full name: ");
        if (scanf("%[^\n]%*c", name) == 1) { // 读取直到行尾,%*c用来跳过缓冲区的换行符
            printf("Enter your age: ");
            scanf("%d", &age);
            printf("Name: %s\n", name);
            printf("Age: %d\n", age);
        } else {
            printf("Failed to read the name.\n");
        }
    
        return 0;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值