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语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135972
  • 函数
    +关注

    关注

    3

    文章

    4298

    浏览量

    62348
  • 代码
    +关注

    关注

    30

    文章

    4731

    浏览量

    68273
  • 编译
    +关注

    关注

    0

    文章

    650

    浏览量

    32784

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

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

收藏 人收藏

    评论

    相关推荐

    C语言中的socket编程基础

    数据 步骤6:关闭socket 创建socket 在C语言中,创建socket需要使用socket()函数。这个函数需要两个参数:域
    的头像 发表于 11-01 16:51 221次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 4851次阅读

    C语言中结构体能不能相加

    C语言中,结构体能不能相加?
    的头像 发表于 12-19 17:04 1196次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>结构体能不能相加

    如何给C语言中函数定义两个不同的名字?

    最近有位哥问我,如何给C语言中函数定义两个不同的名字?就是这两个名字都是指向同一个函数,同一个地址,而且两个名字都可以当做函数来用的那种。
    的头像 发表于 12-19 16:21 736次阅读

    c语言中decimal的含义

    C语言中的“decimal”是一种数据类型,用于表示十进制数字。在C语言中,常用的数据类型有整数类型(int)、浮点类型(float和double)、字符类型(char)等,而deci
    的头像 发表于 11-30 10:57 2245次阅读

    c语言中函数函数体用什么符号括起来

    知道函数是数学里的重要组成部分,数学中我们常见函数的概念,但是你了解C语言中函数吗?其实
    的头像 发表于 11-24 15:52 658次阅读
    <b class='flag-5'>c</b><b class='flag-5'>语言中</b><b class='flag-5'>函数</b>的<b class='flag-5'>函数</b>体用什么符号括起来

    c语言中数组怎么定义

    C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中,定义数
    的头像 发表于 11-24 10:11 2840次阅读

    c语言scanf的正确使用及技巧

    C语言scanf函数是用来从程序的标准输入或文件中读取输入的函数。它可以从键盘读取用户输入,并将其存储在变量中。虽然
    的头像 发表于 11-24 10:04 4665次阅读

    c语言怎么用scanf输入字符串

    C语言中,我们可以使用scanf函数来接收用户的输入。scanf函数有很多种用法,其中一种用法
    的头像 发表于 11-24 10:03 2505次阅读

    c语言gets函数可以输入数字吗

    来了解一些与输入有关的C语言函数C语言提供了许多函数来从用户获取输入,包括
    的头像 发表于 11-24 10:00 1410次阅读

    \0在c语言中怎么用

    C语言是一种广泛使用的程序设计语言,具有高效、简洁和可移植等特点。本文将详尽介绍C语言的基本语法、数据类型、控制结构、
    的头像 发表于 11-24 09:59 2983次阅读

    scanfC语言中的作用

    scanfC语言中的作用  scanfC语言中的输入函数
    的头像 发表于 11-23 14:13 1279次阅读

    c语言max函数在哪个库

    C语言的max函数并不属于标准C库,它通常是由程序员自己编写的一个宏定义。max函数用于比较两个数的大小,返回较大的数值。 为了提供更多详实
    的头像 发表于 11-22 10:18 3268次阅读

    C语言中如何实现注释

    C语言中,注释是用来增加代码可读性和注释过程和功能的文本。C语言中支持两种类型的注释:单行注释和多行注释。 单行注释以双斜杠(//)开始,直到该行结束。该注释语句可以在代码的任何位置
    的头像 发表于 11-22 10:17 1208次阅读

    C语言常见问题

    电子发烧友网站提供《C语言常见问题集.pdf》资料免费下载
    发表于 11-18 10:29 0次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>常见问题</b>集