(文章目录)

前言

  <font color = green > 🌈hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。</font>   <font color = green > ⛳️今天博主就给大家介绍一下scanf函数,以及在《牛客网》写题时遇到的多组输入该如何解决?</font>   <font color = Orange > 📚本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐!</font>   <font color = purple>:tent: 欢迎铁汁们 :heavy_check_mark: 点赞 👍 收藏 ⭐留言 📝!</font>

💬 scanf( ) 函数的介绍

📜说明:

🔥 <font color = purple>关于scanf( )我们在C++官网看一下</font> 在这里插入图片描述 📚 <font color = red>注:关于scanf的参数类型官网上描述太复杂了,所以博主就不截取了。</font>

  • <font color = Orange>由博主给大家讲解讲解讲解关键点</font>

<font color = Orange size=4>scanf 的功能用一句话来概括就是“<font color="#dd0000">通过键盘给程序中的变量赋值</font>”。</font> ✅ 函数的原型为:

# include <stdio.h>
int scanf(const char *format, ...);

💬 scanf( )的俩种用法

🌱示例一:

<kbd><font color="#660000" size=4> scanf(“输入控制符”, 输入参数);</font></kbd>

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

⛳️输入控制符
  • 🌲<font color = red>“输入控制符”和“输出控制符”是一模一样的。</font>
  • 🌲 <font color =purple> 比如一个整型数据,通过 printf 输出时用%d输出,通过 scanf 输入时同样是用%d。</font>

📌 <font color="#006666" size=5>那么为什么需要输入控制符呢 ?</font>

  • 首先我们要清楚,我们从键盘输入的全部都是字符。比如从键盘输入 123,==它表示的并不是数字 123,而是字符 ‘1’、字符 ‘2’ 和字符 ‘3’。==
  • <font color = red>操作系统在接收键盘数据时都将它当成字符来接收的。这时就需要用“输入控制符”将它转化一下。%d的含义就是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过 %d 转化完之后,字符 123 就是数字 123 了。</font>

📌 <font color="#006666" size=5>使用&取地址操作符的作用</font>

  • <font color = purple>&是一个取地址运算符,&后面加变量名表示“该变量的地址”。</font>
  • &i又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中。

📝 <font color = red>注:所以这里scanf 语句的意思就是:从键盘上输入字符 123,然后%d将这三个字符转化成十进制数 123,最后通过 “取地址 i” 找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中。</font>

⛳️ 输入参数

注:<font color = green>输入参数就是键盘上的字符</font>

  • 常用输入控制符 📚 <font color = red>附录:</font>
输入控制符 格式描述
%d 整型格式
%ld 长整型格式
%lld long long 格式
%f 单精度浮点型格式
%lf 双精度浮点型格式
%p 地址的格式
%c 字符格式
%s 字符串格式
%p 地址的格式
🌱示例二:

<kbd><font color="#660000" size=4> scanf(“输入控制符非输入控制符”, 输入参数);</font></kbd> <font color = Orange>这种用法几乎是不用的,也不建议你们使用。</font>

  • <font color="#006666">但是经常有人问,为什么 printf 中可以有“<font color= red>深红色文字</font> 非输出控制符”,而 scanf 中就不可以有“非输入控制符”。事实上不是不可以有,而是没有必要!</font>

🔥 <font color = red>注: 输出控制符,我们前面讲了的大家没记住的可以去看看。</font>

<font color="#666600">不知道大家理解了嘛? 不理解也没关系演示一边就懂了</font> 🏅 咱们是就是说,实践出真理。

📖 代码演示:

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

💭 运行结果: 在这里插入图片描述 <font color = Orange>注:在 printf 中,所有的“<font color = red>非输出控制符</font>”都要原样输出。同样,在 scanf 中,所有的“<font color = red>非输入控制符</font>”都要原样输入。</font>

  • 🌱==所以在输入的时候,i= 必须要原样输入。==
  • 🌱<font color="#006666">比如要从键盘给变量 i 赋值 123,那么必须要输入i=123才正确,少一个都不行,否则就是错误。</font> 在这里插入图片描述

💬 scanf( )的返回值

==<font color = green>这是我们本期的重点,想要知道scanf( ) 是如何多组输入的就,必须要弄懂它的返回值。</font>==

在这里插入图片描述 ⛳️ <font color = purple size=4>大家看参考文献这里说:</font>

  • <font color = red>成功时,返回成功填充的参数列表的项数。</font>
  • <font color = red>失败时,返回EOF</font>
📖 EOF的含义

EOF在C语言中是这样定义的:

  • <kbd><font color ="#660000">#define EOF (-1)</font></kbd>
  • <font color = purple>它的意思就是由#define定义的EOF为-1</font>
  • <font color = red>所以当scanf返回失败的时候返回的就是-1</font>

==<font color =blue size=4.2>那么怎么样返回错误呢?</font>==

  • 🌱ctrl+z会让 scanf 或者 getchar 返回EOF就可以啦!
  • 🌱注:在VS 2022等编译器需要按3次ctrl+z才能返回EOF。

💬scanf( )的三种多组输入方式

⛳️ 利用返回值多组输入

☁️ 首先我们就得了解scanf( )的返回值而上面博主也讲过这样一句话:

<font color="#006666" size=4>scanf( )接收成功的返回值</font>

  • 📜 <font color = red>成功时,返回成功填充的参数列表的项数。</font>

<font color = green>这是什么意思呢?写一段代码大家就明白了。</font>

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

📑运行结果: 在这里插入图片描述 💡 <font color = red size=4>这估计大家都明白了!哦,原来scanf函数接收成功时返回的是填充的参数列表的项数。</font>

📖问题引入:

<font color = green>那么想多组输入还不简单吗?直接循环不就完了</font>

  • ==让它只要没读取错误就一直循环,而返回成功的值我们已经知道了。==
int main()
{
    int i = 0;
    while (scanf("%d", &i) ==1)
    {
        printf("i = %d\n", i);
    }       
    return 0;
}

📑运行结果: 在这里插入图片描述

⛳️ 利用EOF多组输入

<font color="#006666" size=4>scanf( )接收失败的返回值</font>

  • 📜 <font color = red>scanf返回失败的时候返回的就是EOF,其实就是返回-1。</font>

<font color = purple>这不就跟前面一样了嘛?我知道各位聪明的铁汁们一定想到了。</font>

  • 只要返回不失败,不就可以多组输入了嘛!

📚 代码演示:

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

📑运行结果: 在这里插入图片描述

⛳️ 利用 ~ 按位取反操作符多组输入

前面说了scanf返回值是

  • <font color = red>成功时,返回成功填充的参数列表的项数。</font>
  • <font color = red>失败时,返回EOF。也就是-1</font>
  • 所以scanf的返回值是 >= -1 的。

<font color = purple size=4>而只有返回值为EOF(-1)的时候其取反(取反操作符~)的值才是0</font>

💭 <font color = Orange size=4>扩展:原反补的概念</font>

🌱<font color = red>给大家扩展一下一个整数在C语言中存的是他的补码</font> ⛳️ <font color = "#660000">原码就是它本身转化成二进制 </font> ⛳️ <font color = "#660000">反码按位取反 同0取1 同1取0 </font> ⛳️ <font color = "#660000">补码 反码加1 </font> <font color = Orange size=3>而-1的补码是:</font>

  • -1的原码: 00000000 00000000 00000000 00000001
  • -1的反码: 11111111 11111111 11111111 11111110
  • -1的补码: 11111111 11111111 11111111 11111111 </br> ==🌱-1全部取反就是全0,就是0。== <font color = red size=4>而0正好可以作为循环结束的标志!</font>
# include <stdio.h>
int main()
{
    int i = 0;
    while (~scanf("%d", &i))
    {
        printf("i = %d\n", i);
    }       
    return 0;
}

📑运行结果: 请添加图片描述

🎬 多组输入的牛客网链接

  📖俗话说,多写多练才能掌握一个知识。   📑其实博主刚开始学C语言练题的时候就被多组输入给难倒了,但是搜索出来的解答大多讲的 不够细节易懂,所以今天分享给大家的都是最简单易懂的。 注:附带多组输入练习题。

编程初学者入门训练 BC51 三角形判断 BC75 数字三角形 ⛳️ 预告一下呢!明天博主就会更新scanf和getchar中的缓冲区概念,所以一点要关注嗷铁汁们!

总结

✅ 归纳: 好了以上就是关于scanf()函数的及其返回值的全部用法了!   scanf的参数   scanf的返回值   EOF的讲解   利用返回值多组输入   利用EOF多组输入   利用 ~ 按位取反操作符多组输入 :cloud: <font color="#006666">学会这些大家就不会再为,scanf函数的多组输入给逼疯啦!</font> <font color = Orange>看到这里了还不给博主扣个 ⛳️ 点赞:sunny:收藏 :star: 关注</font> 💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖 <font size = 5 face = "华文彩云" color =red>拜托拜托这个真的很重要!</font> <font color="#660066">你们的点赞就是博主更新最大的动力!</font> <font color="#660066">有问题可以评论或者私信呢秒回哦。</font> 在这里插入图片描述