神奇的scanf,到底有哪些神奇的用法呢?(速成版)

       本文讲介绍C语言中格式化输入函数scanf的用法,并且会结合一些实例进行讲解。无论在C语言中还是C++语言中,scanf都是一个非常重要以及常用的函数,所以是必须要掌握的。在今天的速成版里,相信大家可以通过我的例子快速掌握对于scanf格式化输入函数的使用。

1. 概述

scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。

该函数的原型为:

#include <stdio.h>                   //或者#include <cstdio>
int scanf(const char *format,...);   //scanf函数原型

调用格式为:

scanf("<格式化字符串>", <地址表>);      //scanf函数调用格式(此处为伪代码)

2. 详细用法

2.1 格式化说明符

scanf函数作为格式化输入函数,输入的变量类型都是需要制定类型的。见下表。(Ps.本人相对比cin更喜欢scanf的原因之一就是格式化可以节约不少时间,在刷题过程中节约一些因为数据量过大而在输入输出浪费的时间)

变量类型中文名格式字符说明
short短整型%u用键盘输入一个短整型
int整型%d用键盘输入一个整型
long长整型%ld用键盘输入一个长整型
long long长长整型%lld用键盘输入一个长长整型
char字符型%c用键盘输入一个字符类型
char []字符数组%s用键盘输入一个字符数组
float单精度浮点型%f用键盘输入一个单精度浮点型
double双精度浮点型%lf用键盘输入一个双精度浮点型

2.2 用法:scanf("<格式化字符串>", 输入参数);

功能:将从键盘输入的字符转化为“<格式化字符串>”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

我们首先来看一个程序:

#include <stdio.h>
int main(){
    int i;
    
    scanf("%d", &i);            //&i 表示变量 i 的地址,&是取地址符
    printf("i = %d", i);
    
    return 0;
}

//输入:123
//输出:i = 123

要弄懂以上这个程序,我要给大家讲明两个点:

(1)我们从键盘输入的都是字符。比如我们从键盘输入123,它表示的并不是整数123,而是字符'1','2','3'。因为操作系统在接收键盘输入数据时,会把我们输入的内容全部当作字符来接收,此时就需要使用“<格式化字符串>”来输入的字符转换成我们想要的值。在该程序中,我使用"%d"将输入的字符'1','2','3'转换成了整型123。

(2)&是一个取地址运算符,&后面加变量名表示“该变量的地址”,所以&i就表示变量 i 的地址。&i`又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中。

看明白这两个点后,我们就可以明白scanf函数的意思就是:从键盘输入字符,并且通过“<格式化字符串>”(比如%d)转换成我们想要输入的类型,并且保存到对应变量中。

2.3 用法:scanf("字符串+<格式化字符串>", 输入参数);

这个用法相比上一个用法的区别,在格式化字符串边上又多了一些“小伙伴”,究竟是干什么用的呢?当然这个用法用的不多,但是大家一定要熟悉这个用法,才能避免因为细节导致的错误。

我们来看一个程序:

#include <stdio.h>
​
int main(){
    int i;
    
    scanf("i = %d", &i);
    printf("i = %d", i);
    
    return 0;
}

在scanf函数中,所有非格式化字符串内容都是需要我们原样输入的。比如在这个程序中,我们想要让i的值为123,那么必须要输入i = 123,才能够得到“i = 123”,少一个都不行,否则错误。

输入错误情况        

输入正确情况  

我们再来看一个程序。

#include <stdio.h>

int main(){

    int a, b;

    scanf("%d,%d", &a, &b);             //输入a,b

    printf("a = %d, b = %d", a, b);     //输出a,b的值

    return 0;
}

在上述程序中,我们发现在输入a,b的格式化字符串中间多了一个逗号,此时我们要如何输入才能使得输出结果为“a = 10, b = 20”呢?答案和上一题差不多,我们需要输入“10,20”,逗号是不可以少的,少了就错啦~

2.4 scanf使用注意事项

(1) “格式化字符串”需要和“参数”的个数一一对应

scanf函数使用过程中,需要把"格式化字符串"和"输入参数"一一对应。

#include <stdio.h>
int main(){
    char ch;
    int i;

   // scanf("%c %d", &ch);              //错误输入方法,没有i的输入参数
    scanf("%c %d", &ch, &i);            //输入:ch 6

    printf("ch = %c, i = %d", ch, i);   //输出:ch = ch, i = 6

    return 0;
}

(2)输入的数据类型一定要与所需要的数据类型一致

在 scanf 中,对于从键盘输入的数据的类型、scanf 中“格式化字符串”的类型、变量所定义的类型,这三个类型一定要一致,否则就是错的。虽然编译的时候不会报错,但会出现运行错误的,则无法实现我们需要的功能。比如:

#include <stdio.h>
int main()
{
    int i;

    scanf("%c", &i);         //i为int类型,如果这里使用%c为字符类型,编译不报错,但是运行有误
    scanf("%d", &i);  
    printf("i = %d\n", i);

    return 0;
}

(3)使用scanf输入数组数据时,要注意"格式化字符串"后面不要多空格

#include <stdio.h>

int main(){
    int a[105], i;

    for(i = 0 ; i < 5; i++){
        //scanf("%d ", &a[i]);            
        //此时在输入完5个数据以后,还需要多输入一个空格,才能有结果
        scanf("%d", &a[i]);
    }
    
    for(i = 0 ; i < 5; i++){
        printf("%d ", a[i]);
    }

    return 0;

}

总结

scanf 的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:

  1. 在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。
  2. scanf 中双引号内,除了“格式化字符串”外什么都不要写(输出特殊要求)。
  3. “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
  4. “输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理,这个稍后再讲。
  5. 使用 scanf 之前加入注释,记录需要输入的内容。

以上是我对于scanf一些常用用法的整理,适合入门学习,后续我也会出更多用法的版本~有任何问题请大家及时指出!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【ACGO】我不会C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值