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

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

3天内不再提示

基于C语言中scanf函数的3种常见问题的原因分析和解决方法

5RJg_mcuworld 2018-01-22 12:34 次阅读

在写代码时总是不小心在这里犯错,所以特意查了一下这个函数,并且做以整理,现分享给大家。

1.空白符问题

#include

main()

{

int a;

printf("input the data ");

scanf("%d ",&a);//这里多了一个回车符

printf("%d",a);

return 0;

}

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

原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d ",&a)也会出现同样的问题。

解决方法:这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题,一个空格也不容易看出来。当你的程序出现上面的问题时,自己对照检查一下就可以了。
基于C语言中scanf函数的3种常见问题的原因分析和解决方法

2.回车符也占位。

#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;

}

如果输入:

a

b

c

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

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

解决方法:

1.不输入回车符,直接输入字符。

2.用gets()函数,如:

#include

main()

{

char c[5];

gets(c);

printf(c);

return 0;

}

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

这是我在百度时见到的问题,还没遇到。拿来整理,以备日后需要。

#include

main()

{

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语句,直接输出为

123

t

原因:对于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); 就可以了。很神奇吧。还要注意方括号两侧都不能加空格。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128532
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66760

原文标题:C语言中scanf函数的3种常见问题与应对技巧

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PCB碱性蚀刻常见问题原因解决方法

    PCB碱性蚀刻常见问题原因解决方法
    发表于 08-03 10:14

    4418开发板常见问题解决方法

    这里有我们总结的一些关于4418开发板的一些常见问题和解决方法,供大家参考
    发表于 09-27 10:38

    C语言常见问题

    C语言常见问题汇总大集合
    发表于 05-10 21:37

    C语言常见问题

    C语言常见问题
    发表于 05-26 11:53

    黄菲林的使用及常见问题解决方法

    黄菲林的使用及常见问题解决方法一,前言:黄菲林是指在透明的聚脂类片材上
    发表于 04-16 20:57 1268次阅读

    镀通孔(PTH)常见问题解决方法

    镀通孔(PTH)常见问题解决方法 (A)孔清洁调整处理   1.问题:基板进行孔清洁处理时带出的泡沫过多,导致下工序槽液被沾污。   原因:   
    发表于 04-08 18:06 3772次阅读

    HYT主机常见问题解决方法

    HYT主机常见问题解决方法 一、TC-5001、无法开机主要原因分析:CPU的7.3728管装插件晶体容易损坏。具体改善方案:06年下半
    发表于 02-07 11:30 1960次阅读

    通用智能后视镜常见问题解决方法

    通用后视镜常见问题解决方法以及高德地图的下载和安装方法
    发表于 11-17 15:37 23次下载

    C语言scanf函数详解

    C语言scanf函数详细解释
    发表于 05-15 09:20 6次下载

    labview有哪些常见问题?labview三个常见问题和解决方法概述

    本文档的主要内容详细介绍的是labview有哪些常见问题?labview三个常见问题和解决方法概述三个常见问题是:1.labview在运行后关闭的时候出现重置vi。一直无法关闭,并且无
    发表于 09-18 18:53 0次下载

    CAN系统中信号终端电阻常见问题解决方法

    CAN系统中信号终端电阻常见问题解决方法
    发表于 05-28 10:20 21次下载

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

    0 ; }     结果要输入两个 数程序才结束,而不是预期的一个。 why? 原因     用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以
    的头像 发表于 09-24 16:45 1413次阅读

    scanf在C语言中的作用

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

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

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

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

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通常是由于尝试访问未授权的变量、
    的头像 发表于 01-12 16:03 1023次阅读