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

    文章

    7523

    浏览量

    127548
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61297
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66667
  • 编译
    +关注

    关注

    0

    文章

    611

    浏览量

    32358

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

    scanf在C语言中的作用

    scanf在C语言中的作用  scanf是C语言中的输入函数,用于从标准输入设备(如键盘)读取数据,并将其存储到变量中。它是C
    的头像 发表于 11-23 14:13 555次阅读

    C语言常见问题

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

    C语言中数字怎么转成指针?

    C语言中数字怎么转成指针,比如我要去内存地址为0x100的内容,用一句话表达,不如uchar a=?我要问号等于0x100地址的内容
    发表于 10-31 06:29

    C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 10-25 07:10

    C51中断函数和汇编语言中断服务程序在用法上有什么不同?

    C51中断函数和汇编语言中断服务程序在用法上有何不同?
    发表于 10-17 08:31

    C语言中宏定义的应用

    在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 385次阅读

    C语言中函数的基本知识

    函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。
    发表于 08-16 18:25 378次阅读

    C语言中指针函数函数指针的概念及应用示例

    在C语言中,指针函数函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。
    发表于 08-16 16:14 336次阅读

    C语言中函数的返回值指向一个指针

    函数的返回值类型必须与函数体内的返回表达式的类型相匹配。如果类型不匹配,编译器会报错。此外,C 语言中函数只能返回一个值,如果需要返回多个值,可以使用结构体或指针等方式来实现。 返回
    的头像 发表于 04-26 11:01 1995次阅读
    C<b class='flag-5'>语言中</b><b class='flag-5'>函数</b>的返回值指向一个指针

    C语言中scanf函数常见问题

    在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。
    的头像 发表于 04-23 09:43 412次阅读