c语言scanf浅谈

这篇具有很好参考价值的文章主要介绍了c语言scanf浅谈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引子

  • 首先看一段简单的代码
    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
        int i;
        char c;
        scanf("%d",&i);
        printf("i=%d\n",i);
        scanf("%c",&c);
        printf("c=%c",c);
        system("pause");
        return 0;
    }
    
  • 运行结果
    1
    i=1
    c=
    
  • 为什么第二个scanf没有成功阻塞程序,直接执行的程序呢?貌似c被赋值为空字符

scanf输入原理

  • 当程序执行scanf函数时,它会从输入缓冲区中读取数据。输入缓冲区是一个临时存储区域,用于存储从输入设备(如键盘)读取的数据。

  • 当用户输入数据时,这些数据会被存储在输入缓冲区中,直到程序调用scanf函数读取这些数据为止。

    • scanf函数会先忽略空格、制表符和换行符等空白字符,然后才会读取非空白字符。这意味着,如果在输入非空白字符之前有空白字符存在,scanf函数会先忽略这些空白字符,然后再读取后面的非空白字符。

    • 在读取数据时,scanf函数会阻塞程序的执行,直到读取到符合格式要求的数据为止。如果输入数据的格式不符合要求,scanf函数会返回一个错误码,并且不会将数据存储在变量中。

  • 在本例中,当程序执行第一个scanf函数读取整数时,它会读取用户输入的数字字符1,并将其转换为整数存储在变量i中。但是由于用户输入的数字后面还有一个换行符,这个换行符会留在输入缓冲区中,等待下一次读取。

  • 当程序执行第二个scanf函数读取字符时,它会从输入缓冲区中读取数据。由于输入缓冲区中还有一个换行符,因此scanf函数会将换行符读取到变量c中,导致变量c中存储的值为空字符。

解决

  • 为了避免这个问题,可以在读取整数后使用一个额外的scanf函数读取换行符,将缓冲区中的换行符清空
    int i;
    char c;
    scanf("%d",&i);
    scanf("%c",&c); // 读取换行符
    printf("i=%d\n",i);
    scanf("%c",&c);
    printf("c=%c",c);
    

scanf循环读取

  • 关于这里while用法的说明

    while(fflush(stdin),(ret= scanf("%d",&i))!=EOF)
    
    • 这种写法是使用逗号运算符将两个表达式连起来,形成一个复合表达式。逗号运算符的作用是先计算左边的表达式,然后再计算右边的表达式,并将右边表达式的值作为整个复合表达式的值。
  • 在下面的例子中,while循环的条件部分使用了逗号运算符将两个表达式连接起来

    1. 调用fflush(stdin)函数,清空输入缓冲区中的数据。
    2. 调用scanf函数,从标准输入设备(如键盘)读取一个整数,并将其存储在变量i中。
    3. 将scanf函数的返回值与EOF进行比较,如果不相等,则表示读取成功,继续执行循环体;如果相等,则表示到达文件结尾,退出循环。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int i;
    int ret;
    //fflush(stdin)清空标准输入缓冲区
    while(fflush(stdin),(ret= scanf("%d",&i))!=EOF)
    {
        printf("i=%d\n",i);
    }
    system("pause");
    return 0;
}
  • 如果想输入多个整数(每次输入都回车),让 scanf函数读取并打印输出,那么需要一个while 循环。

  • 代码中为什么要加入fflush(stdin)函数呢?

  • 因为fflush函数具有刷新(清空)标准输入缓冲区的作用。

    • 如果输错,输入的为字符型数据,那么scanf函数就无法匹配成功, scanf函数未匹配成功时其返回值为0,即ret的值为0,但这并不等于EOF,因为EOF的返回值为-1
    • 当scanf函数无法匹配成功时,程序仍然会进入循环,这时会导致不断地重复打印
  • 改进:字符串并打印对应字符串的大写字母文章来源地址https://www.toymoban.com/news/detail-743115.html

    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
        int i;
        char c;
        while(scanf("%c",&c)!=EOF)
        {
            if(c!='\n')
                printf("%c",c-32);
            else
                printf("\n");
        }
        system("pause");
        return 0;
    }
    

到了这里,关于c语言scanf浅谈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】连续使用多个scanf函数时输入数据

    在多次使用scanf函数时常常会出现下面的情况: 运行下列代码: (1)有关回车(Enter) 从键盘中输入: 按回车(Enter)后输入: 按回车(Enter)后运行结果为: (2)有关空格 从键盘中输入(含空格): 按回车(Enter)后运行结果为: 运行下列代码: (1)有关回车(Enter)

    2024年02月06日
    浏览(48)
  • 【C语言】scanf多组输入的三种方法!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。    ⛳️ 今天博主就给大

    2024年02月06日
    浏览(46)
  • C语言—printf和scanf详解(万字笔记更新中....)

    在写c语言时,printf和scanf是我们必不可少且常用的,相信大多数人对它们俩的认识只是停留在表面上,并没有深入了解过它们吧,那么这一篇文就来深入对它们俩来说道说道 Printf:输出函数,将参数输出到屏幕上 案例: printf( \\\"hello nworldn\\\" ) :将hello word打印到屏幕上

    2024年03月23日
    浏览(44)
  • 【C语言基础考研向】05 scanf读取标准输入超详解

    文章目录 一.scanf函数的原理 样例 问题原因 解决方法 二.多种数据类型混合输入 错误样例 正确样例   C语言未提供输入/输出,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入, 键盘输入又被称为标准输入 。当scanf函数读取标准输入时,如

    2024年01月22日
    浏览(47)
  • C语言初阶--连用scanf(以%c读取时)遇到的问题

    在我们写程序的过程中,会频繁使用scanf函数,当在一个程序中scanf用多了,会出现输入不了的问题!大家有没有想过是什么原因导致的该问题呢?下面我们一起探讨一下吧! 遇到问题的例子: 代码运行的结果: 调试的结果为: 描述问题: 我们在输入第一个字符‘a’的时候

    2023年04月18日
    浏览(37)
  • 【C语言初阶篇】scanf和getchar中缓存区的概念!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf和getchar()语句吧,但是关于缓存区的概念,我相信大多数人都没有听说过吧。    ⛳️ 写

    2024年02月14日
    浏览(49)
  • 关于【C语言】中scanf与getchar的用法和常见错误详解

    写这篇博客的起因是最近博主自己学习中总是遇到类似的错误,并曾百思不得其解。 今天分享出来是希望帮助大家在写代码时避免这些错误。话不多说,我们直接开始吧! 君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 我们先来看看再MSDN里对scanf的解释 - scanf 的功能

    2024年02月05日
    浏览(51)
  • C 语言用户输入详解:scanf、fgets、内存地址解析及实用指南

    您已经学习了 printf() 函数用于在 C 语言中输出值。 要获取用户输入,可以使用 scanf() 函数: scanf() 函数接受两个参数:变量的格式说明符(在本例中为 %d )和引用运算符( myNum ),用于存储变量的内存地址。 scanf() 函数还允许进行多个输入(例如,在下面的例子中,用户可

    2024年02月03日
    浏览(61)
  • 【C语言】EOF搭配while循环来控制scanf输入的次数

    目录 EOF是什么? EOF搭配while的实际应用场景1 EOF搭配while的实际应用场景2 补充 后言 EOF , 在C语言的标准函数库中表示 文件结束符 (end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。 在文本文件中,数据都是以字符的ASC

    2024年02月10日
    浏览(39)
  • 让Windows上vscode的C语言scanf函数可以读取中文字符

    区域设置–时钟和区域–区域–管理–更系统区域设置–(不要勾选)使用UTF-8。 查看验证当前字符集: cmd chcp 活动代码页: 936 936就是简体中文GBK 点击左下角设置齿轮 – 点击右上角文本样的图标 就可以打开json配置文件

    2024年01月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包