广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言scanf的工作原理详解
  • 547
分享到

C语言scanf的工作原理详解

2024-04-02 19:04:59 547人浏览 独家记忆
摘要

目录原理解释解决办法总结原理解释 先来观察一段代码和运行结果: #include <iOStream> using namespace std; int main()

原理解释

先来观察一段代码和运行结果:

#include <iOStream>

using namespace std;

int main() {
    int a;
    char c;
    scanf("%d", &a);
    printf("a = %d", a);
    scanf("%c", &c);
    printf("c = %c", c);
}

在这里插入图片描述

该代码明明有两个 scanf ,但在运行过程中,执行完第一个 scanf 和 printf 后,代码直接停止了,并没有继续执行下一个 scanf ,这是为什么呢?

下面先介绍缓冲区原理。

行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的io操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作.典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout)。

如上面例子所示,我们向标准输人缓冲区中放入的字符为 ‘20\n’,输入’\n’(回车)后, scanf 函数才开始匹配, scanf 函数中的%d 匹配整型数 20 ,然后放入变量 i 中,接着进行打印输出,这时 ‘\n’ 仍然在标准输入缓冲区(stdin)内,如果第二个 scanf 函数为 scanf("%d",&i) ,那么依然会发生阻塞,因为 scanf 函数在读取整型数、浮点数、字符串(后面介绍数组时讲解字符串)时,会忽略 '\n’ (回车符)、空格符等字符(忽略是指scanf 函数执行时会首先删除这些字符,然后再阻塞), scanf 函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行 scanf("%c",&c) 语句时,不会忽略任何字符,所以 scanf("%c",&c) 读取了还在缓冲区中残留的 ‘\n’ 。

上面说的很专(啰)业(嗦),实际上就是:scanf 接收的是 %c,它把还存在缓冲区的 ‘\n’ 当成了一个字符,导致了代码结束,如果 scanf 接收的是其他类型的数据,则会忽略这个 ‘\n’,继续运行下面的代码,再举一个例子:

#include <iostream>

using namespace std;

int main() {
    int a;
    int c;
    scanf("%d", &a);
    printf("a = %d", a);
    scanf("%d", &c);
    printf("c = %d", c);
}

在这里插入图片描述

例如以上代码,我输入了好多个空格,但根本不影响实际的运行结果,因为它们都被 printf 在缓冲区内删除掉了,scanf 是不会删除缓冲区的内容的。

再来看一段代码理解一下:

#include <iostream>

using namespace std;

#define EOF (-1)

int main() {
    int i;
    while (scanf("%d", &i) != EOF) {
        printf("i=%d\n", i);
    }
}

在这里插入图片描述

以上的 scanf 输入,是 10,20,a 的顺序输入,在输入 a 之后,代码一直打印上一个 printf 的内容,这是因为: scanf 返回的是成功读入的数据项数,在我的输入中输入了一个 a ,a 是无法匹配 %d 的,scanf 也不会删除 a ,所以 scanf 的返回值是 0(没有成功匹配),不等于 -1 ,此时就会一直 while 循环。

并且,在 scanf 返回值为 0 的情况下,没有读取 i 的值,此时 i 的值还是上一次输入的 20,这就会导致 while 循环一直打印上一次的 i=20。

返回 int 类型

解决办法

使用 rewind(stdin) 清空缓冲区:

#include <iostream>

using namespace std;

#define EOF (-1)

int main() {
    int i;
    while (rewind(stdin), scanf("%d", &i) != EOF) {
        printf("i=%d\n", i);
    }
}

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: C语言scanf的工作原理详解

本文链接: https://www.lsjlt.com/news/161560.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言scanf的工作原理详解
    目录原理解释解决办法总结原理解释 先来观察一段代码和运行结果: #include <iostream> using namespace std; int main()...
    99+
    2022-11-12
  • C语言scanf的工作原理是什么
    这篇文章主要介绍“C语言scanf的工作原理是什么”,在日常操作中,相信很多人在C语言scanf的工作原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言scanf的工作原理是什么”的疑惑有所帮助!...
    99+
    2023-06-22
  • C语言中scanf函数详解
    scanf函数是C语言中用于从标准输入流中读取数据的函数。它的原型如下:```cint scanf(const char *form...
    99+
    2023-09-13
    C语言
  • C语言中scanf与scnaf_s函数详解
    目录scanf_s使用scanf_sscanf使用scanf总结scanf_s scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc...
    99+
    2022-11-12
  • C语言中scanf与scanf_s函数的使用详解
    目录1.scanf_s(是vs提供的函数)2.scanf(标准的库函数)3.总结1.scanf_s(是vs提供的函数) a.代码1 int main() { char a = ...
    99+
    2022-11-12
  • C语言中scanf函数的原样输入的坑及解决
    目录scanf函数的原样输入的坑及解决1、scanf函数格式控制后面输入2、scanf函数的输入是有顺序的3、最重要的一点就是scanf切记要原样输入4、还有一个scanf输入多个数...
    99+
    2022-11-13
  • C语言中关于scanf函数的一些问题详解
    在学习创建二叉树时遇到了scanf的一些问题,在此记录下来 创建根节点A后理想情况是输入A的左子树,若不为空继续创建左子树,但输入A后发现重复创建了一个左子树,测试后发现输入A换行...
    99+
    2022-11-12
  • C语言中scanf函数的原样输入的坑怎么解决
    这篇文章主要讲解了“C语言中scanf函数的原样输入的坑怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中scanf函数的原样输入的坑怎么解决”吧!scanf函数的原样输入的坑及...
    99+
    2023-07-02
  • C语言详解格式控制符scanf与printf的输入输出
    目录一、使用scanf输入和printf输出1、scanf的使用2、printf的使用二、常用输出格式1、%md2、%0md3、%.mf三、使用getchar输入putchar输出单...
    99+
    2022-11-13
  • C语言进度条的实现原理详解
    目录\r和\n行缓冲区进度条\r和\n 在程序里面,\r和\n分别代表什么意思? \r:表示“回车”,即回到当前行的起始位置 \n:表示换行,即列不变,另其一...
    99+
    2022-11-13
  • Go语言中并发的工作原理
    一、Go语言中Goroutine的基本原理 Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。 Go语言的goroutine是一个独立的工作单元, Go 语言的并发同步模型...
    99+
    2022-11-13
  • Springboot工作原理详解
    目录 一、Spring Boot 1.1.Spring Boot 优点  二、SpringBoot 运行原理 1.1. pom.xml  2.2. 主启动类的配置 3.3. 主启动类的运行 三、自动配置原理 3.1、启动类上注解的作用  3...
    99+
    2023-10-10
    spring boot java spring
  • 详解MyBatis工作原理
    目录一、Mybatis工作原理二、Mybatis运行原理总结一、Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworl...
    99+
    2022-11-12
  • SELINUX工作原理详解
    1. 简介 SElinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。     Security-Enhanced Linux (SELinux)由以下两部分组成: ...
    99+
    2022-06-04
    SELINUX 工作原理
  • C语言的堆串操作详解
    目录一、堆串概念。二、基本操作。三、运行:总结一、堆串概念。 与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空...
    99+
    2022-11-13
  • C语言预处理详解
    目录一,预定义符号二,#define1,#define 定义标识符2,#define 定义宏3,#define 替换规则三,##的作用1,概念2,带副作用的宏参数3,宏和函数对比四,...
    99+
    2022-11-12
  • CRC校验原理及其C语言实现详解
    目录前言CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周...
    99+
    2023-03-10
    C语言 CRC校验 C语言 CRC原理 C语言 CRC
  • C语言 链式二叉树结构详解原理
    目录前言二叉树节点声明二叉树的遍历构建二叉树1.前序遍历2.中序遍历3.后序遍历二叉树节点的个数二叉树叶子节点的个数二叉树第K层节点个数二叉树的高度/深度二叉树查找值为x的节点整体代...
    99+
    2022-11-12
  • C语言文件操作详解
    目录一、什么是文件二、文件缓冲区三、文件指针四、文件的打开和关闭。总结一、什么是文件 在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。 程序文件: 包括源程序文件(后缀为....
    99+
    2022-11-12
  • 详解C语言之操作符
    目录1.加减乘2.除(/)注意:3.取余(%)注意:4.移位操作符(>> <<)注意5.位操作符(| ,& ,^)6.逻辑操作符(&&...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作