侵权投诉

剖析C语言中scanf函数常见问题

STM32嵌入式开发 2021-09-24 16:45 次阅读
在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。

空白符问题

#include
int main(void){  int a;  printf("input the data ");  scanf("%d ",&a);  //这里多了一个回车符  printf("%d",a);  return 0;}

结果要输入两个数程序才结束,而不是预期的一个。why?

原因用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d ",&a)也会出现同样的问题。解决方法这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题,一个空格也不容易看出来。当你的程序出现上面的问题时,自己对照检查一下就可以了。

回车符也占位

#include main(){ int n = 5; char c[n]; for(int i = 0; i < n; i++)  c[i] = scanf("%c",&c[i]);  printf(c);return 0;}

如果输入:

abc

那么循环就会“提前”结束了。

原因

输入a和第一个回车后,a和这个回车符都留在缓冲区中。第一个scanf读取了a,但是输入缓冲区里面还留有一个 ,第二个scanf读取这个 。然后输入b和第二个回车,同样的,第三个scanf读取了b,第四个scanf读取了第二个回车符。第五个读取了c。所以五个scanf都执行了,并没有提前结束。只不过有的scanf读取到了回车符而已。

解决方法

1.不输入回车符,直接输入字符。 2.用gets()函数,如:
#includemain(){    char c[5]; gets(c); printf(c); return 0;}

scanf()函数的参数输入类型不匹配问题

在某度见到的问题:

#includemain(){ int a=123; char c='t'; printf("input "); scanf("%d%c",&a,&c); scanf("%d%c",&a,&c); scanf("%d%c",&a,&c); printf("%d %c ",a,c); return 0;}

当输入a 回车 后,会直接跳过下面2个scanf语句,直接输出为:

123t

原因

对于scanf("%d%c",&a,&c),scanf语句执行时,其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句。

解决方法

scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还有残余信息问题。

比如:

#include  main(){ int a=123,b; while(scanf("%d%d",&a,&b)!=2)  fflush(stdin); printf("%d %d ",a,b); return 0;}

还有个办法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。还要注意方括号两侧都不能加空格。

编辑:jq

原文标题:C语言中scanf函数的常见问题

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

微软官方开发的VS Code扩展介绍

【导语】:CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演....
的头像 数据分析与开发 发表于 10-22 17:13 191次 阅读

2021华为开发者大会:鸿蒙智联设备开发效率倍增

2021华为开发者大会:分布式应用服务开发环境,以用户为中心的自然智慧交互,突破跨端开发调试困难,丰....
的头像 lhl545545 发表于 10-22 15:57 254次 阅读
2021华为开发者大会:鸿蒙智联设备开发效率倍增

怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢

printf 函数和getchar 函数有何功能? 怎样用printf 函数和getchar 函数去简化STM32串口数据的传输呢? ...
发表于 10-22 07:49 0次 阅读

怎样去设计一种基于单片机的智能窗帘呢

怎样去设计一种基于单片机的智能窗帘呢?怎样去编写其主函数代码呢?...
发表于 10-22 07:29 0次 阅读

请问在C语言中如何使用bool类型?

在C语言中如何使用bool类型?
发表于 10-22 07:20 0次 阅读

STM32F103C8T6的串口配置步骤有哪些

STM32F103C8T6有哪几个串口? STM32F103C8T6的串口配置步骤有哪些?怎样去编写代码呢? ...
发表于 10-22 06:35 0次 阅读

C语言堆栈程序内存的分配

    程序内存的分配       一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(s....
的头像 嵌入式ARM 发表于 10-21 14:51 77次 阅读

ML规模复杂的相关基础架构

  Waze 是世界上最大的基于社区的交通和导航应用。该应用借助实时数据来帮助用户避开路上的障碍,享....
的头像 TensorFlow 发表于 10-21 14:07 122次 阅读

精选汇总 | 嵌入式C语言

为了方便大家平时公交、地铁、外出办事也能用手机回顾查看文章,我特意用心精选,并分类整理了部分文章:嵌....
发表于 10-21 11:36 6次 阅读
精选汇总 | 嵌入式C语言

【嵌入式】C语言中volatile关键字

00. 目录文章目录00. 目录01. volatile概述02. volatile应用场景03. ....
发表于 10-21 10:21 8次 阅读
【嵌入式】C语言中volatile关键字

从存储器哪一个位置开始读取代码呢

代码是从哪里开始运行的? 从存储器哪一个位置开始读取代码呢?...
发表于 10-21 09:11 0次 阅读

串口通信的相关代码学习

怎样去编写一种简单的串口通信代码呢? 什么是SBUF? ...
发表于 10-21 09:10 0次 阅读

如何对STM32H747 / STM32H745进行测试

STM32H747/757系列产品有哪些性能? 如何对STM32H747 / STM32H745进行测试? ...
发表于 10-21 08:24 0次 阅读

怎样去解决使用MDK开发touchgfx项目编译慢的问题呢

怎样去解决使用MDK开发touchgfx项目编译慢的问题呢? 如何使用ARM Compiler 6.15去编译TouchGFX工程呢?...
发表于 10-21 07:58 0次 阅读

怎样用最新版的MDK530去编译原来的代码呢

怎样用最新版的MDK530去编译原来的代码呢? MDK530编译为什么会出现ARM版本不符的问题? ...
发表于 10-21 07:26 0次 阅读

嵌入式软件工程师面试常见问题3

1.有一个16位的整数,每4位为一个数,写函数求他们的和。解释:整数1101010110110111....
发表于 10-20 21:51 6次 阅读
嵌入式软件工程师面试常见问题3

零基础学习嵌入式C语言要学习什么?

在嵌入式开发的过程中,C语言是占很重要的位置的,可以很清楚的说这两者之间是要做到你中有我,我中有你的....
发表于 10-20 21:21 11次 阅读
零基础学习嵌入式C语言要学习什么?

整理一份嵌入式必看的经典书籍

C语言篇参考文档#mermaid-svg-hZ6bg606c214m6nM .label{font-....
发表于 10-20 20:06 4次 阅读
整理一份嵌入式必看的经典书籍

肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)

不好意思久等了这篇文章让小伙伴们久等了。一年多以来,关于嵌入式开发学习路线、规划、看什么书等问题,被....
发表于 10-20 19:36 4次 阅读
肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)

嵌入式和机械哪个好?机械转嵌入式好转吗?

大家好,我是无际。最近有一些做机械的朋友找到我,说嵌入式好不好学。深度聊完以后,我抓到了他们的几个吐....
发表于 10-20 19:06 5次 阅读
嵌入式和机械哪个好?机械转嵌入式好转吗?

嵌入式开发学习路线 及书籍推荐

嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方....
发表于 10-20 18:06 5次 阅读
嵌入式开发学习路线 及书籍推荐

单片机属于嵌入式系统吗?嵌入式开发要学哪些课程?

记得在3月份,有一个学员问了我一个问题,什么是嵌入式,单片机是属于嵌入式吗?嵌入式开发要学什么?说实....
发表于 10-20 17:50 11次 阅读
单片机属于嵌入式系统吗?嵌入式开发要学哪些课程?

探究IntelliJ IDEA 中JAVA代码的任务标记

【任务标记是以注释的方式定义】 一、作用:1、可以大大的提高开发效率。代码量非常大的项目,在某一行中....
的头像 Android编程精选 发表于 10-20 17:10 224次 阅读
探究IntelliJ IDEA 中JAVA代码的任务标记

详细介绍go语言中的闭包的实现

什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关....
的头像 马哥Linux运维 发表于 10-20 16:18 223次 阅读

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 576次 阅读

简述ElasticSearch的实现

1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个....
的头像 马哥Linux运维 发表于 10-20 14:45 233次 阅读

Python协程与JavaScript协程的对比及经验技巧

前言以前没怎么接触前端,对 JavaScript 的异步操作不了解,现在有了点了解。一查发现 Pyt....
的头像 马哥Linux运维 发表于 10-20 14:30 163次 阅读

嵌入式练习

嵌入式练习在Ubuntu系统下用C语言编写一个简单的输出 hello word的程序,并编译有、运行....
发表于 10-20 13:51 8次 阅读
嵌入式练习

设置I帧的QP的示例代码

  介绍 在有些应用中,发现I帧不够大。MPSoC VCU CtrlSW可以设置每一帧的QP大小。因....
的头像 FPGA开发圈 发表于 10-20 11:35 235次 阅读

IAP编程page0返回失败的问题总结

最近在支持客户的时候遇到这样一个问题:客户在做自己的二级boot loader,并且在使用LPC54....
的头像 恩智浦MCU加油站 发表于 10-20 10:59 194次 阅读
IAP编程page0返回失败的问题总结

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装概述“C语言”....
发表于 10-20 09:59 17次 阅读
嵌入式开发语言-C语言编程

如何快速构建嵌入式全栈知识体系

嵌入式是一门交叉学科。一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计....
发表于 10-20 09:59 5次 阅读
如何快速构建嵌入式全栈知识体系

pyBGAPI蓝牙代码库的软件结构

新的Python代码库-pyBGAPI可帮助开发人员通过Silicon Labs(亦称“芯科科技”)....
的头像 SiliconLabs 发表于 10-20 09:57 152次 阅读

无接口驱动程序基于ATEasy代码功能

作为一款新型的自动化测试软件,ATEasy 驱动程序为 ATEasy 应用程序提供了一种与设备或仪器....
的头像 广州虹科电子科技有限公司 发表于 10-20 09:29 124次 阅读

嵌入式 C 语言(上)

目录基础知识数据类型const 用法作用域与 static 用法extern 用法基础知识嵌入式C语....
发表于 10-19 18:33 22次 阅读
嵌入式 C 语言(上)

嵌入式系统C语言编程基础

文章目录Q1:所有嵌入式系统的主流程最后都进入一个死循环,怎样用C语言实现─个死循环?A1Q2:wh....
发表于 10-19 18:32 3次 阅读
嵌入式系统C语言编程基础

简述图像梯度的基本原理

当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用。我们当然希望看到的是清晰图像。那么,清晰图....
的头像 新机器视觉 发表于 10-19 16:22 151次 阅读
简述图像梯度的基本原理

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 181次 阅读
深入探讨 Hilt的工作原理

一文了解Cortex-M中断向量表对齐原则

来源 | 痞子衡嵌入式 一、Cortex-M中断向量表对齐原则   中断向量表就是一个集中保存系统全....
的头像 strongerHuang 发表于 10-19 11:06 220次 阅读
一文了解Cortex-M中断向量表对齐原则

CPrimer_Plus第六版中文版下载

CPrimer_Plus第六版中文版下载
发表于 10-18 10:20 32次 阅读

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 264次 阅读

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 225次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 144次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 274次 阅读
动态内存分配的注意事项及本质是什么

ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

来自:复旦DISC 引言 本次分享我们将介绍三篇来自ACL2021的跨视觉语言模态的论文。这三篇文章....
的头像 深度学习自然语言处理 发表于 10-13 10:48 249次 阅读
ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

一文详解虚函数及其相关知识点

本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)虚析构函数; (2)纯虚函数; (3....
的头像 C语言编程学习基地 发表于 10-13 10:14 234次 阅读

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 201次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 268次 阅读
关于Python对交通路口的红绿灯进行颜色检测

合见工软发布高性能仿真器UniVista Simulator

上海合见工业软件集团有限公司(简称合见工软)今日推出全新的高性能数字验证仿真器UniVista Si....
发表于 10-13 09:27 108次 阅读
合见工软发布高性能仿真器UniVista Simulator

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 219次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 162次 阅读
 xv6的文件系统是如何实现的