0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32嵌入式开发 来源:STM32嵌入式开发 作者: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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144632
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66851
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73155
  • 编译
    +关注

    关注

    0

    文章

    688

    浏览量

    34950

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    scanf函数介绍

    scanf函数向字符型数组输入数据char a[20]; scanf(\"%s\", a); 错误 scanf(%s\",a); 正确 用s
    发表于 12-02 06:07

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行代码块; } 其语义是:如果表达式的值为真,则执行其后的语句,否则不执
    发表于 11-25 07:48

    C语言常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```
    发表于 11-24 08:29

    C语言宏拼接运算符典型使用

    C语言中,##运算符(称为[size=16.002px]标记拼接运算符)用于宏定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型名,以提高代码
    发表于 11-20 08:27

    Arty移植蜂鸟E203后,发现不支持scanf函数,怎么解决?

    本人想用Arty A7 35T做一些基于蜂鸟E203的串口交互开发,目前已经移植并且成功运行了printf函数。 在测试scanf函数的时候,发现结果不理想(好吧其实就没反应),于是读源码,看到了下面这句话 请问是不是没救了?
    发表于 11-07 07:13

    ZYNQ UltraScalePlus RFSOC QSPI Flash固化常见问题说明

    璞致 ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常见问题说明
    发表于 08-08 15:49 0次下载

    C语言中的内联函数与宏

    C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1724次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的内联<b class='flag-5'>函数</b>与宏

    PCBA代工避坑指南:常见问题+解决方案全解析

    一站式PCBA加工厂家今天为大家讲讲PCBA代工代购元器件常见问题有哪些?PCBA代工代购元器件常见问题及解决方案。随着科技的不断发展和市场需求的变化,越来越多的企业选择通过外包方式进行PCBA生产
    的头像 发表于 07-09 09:38 471次阅读

    Windows环境下32位汇编语言中文资料

    电子发烧友网站提供《Windows环境下32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    深入理解C语言C语言循环控制

    改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种
    的头像 发表于 04-29 18:49 1740次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    deepin 25系统安装常见问题

    随着 deepin 25 系列版本的发布,我们特别推出 deepin Q&A 常见问题指南,旨在帮助您轻松应对安装、升级及使用过程中可能遇到的常见问题
    的头像 发表于 04-14 14:08 4513次阅读
    deepin 25系统安装<b class='flag-5'>常见问题</b>

    电机故障诊断常见误区的剖析

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机故障诊断常见误区的剖析.pdf (免责声明:本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!)
    发表于 04-07 17:35

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言中</b>访问短字内存

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的DSP:从<b class='flag-5'>C</b>调用汇编类成员<b class='flag-5'>函数</b>

    电子设备EMC测试整改:常见问题与解决方案

    深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
    的头像 发表于 12-23 11:47 1868次阅读
    电子设备EMC测试整改:<b class='flag-5'>常见问题</b>与解决方案