专栏中心

EEPW首页 > 专栏 > scanf()函数用法及常见问题汇总

scanf()函数用法及常见问题汇总

发布人:北京华清远见 时间:2013-03-26 来源:工程师 发布文章
 

scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息,其调用格式为:   scanf("<格式化字符串>",<地址表>);这里对scanf()函数用法小结一下。

格式化字符串包括以下三类不同的字符;

1 格式化说明符:

格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。我们来看下面这个表。

格式字符

    说明

%d

从键盘输入十进制整数

%o

从键盘输入八进制整数

%x

从键盘输入十六进制整数

%c

从键盘输入一个字符

%s

从键盘输入一个字符串

%f

从键盘输入一个实数

%e

与%f的作用相同

附加格式说明字符表

字符

说明

L

输入"长"数据

H

输入"短"数据

M

指定输入数据所占宽度

*

空读一个数据

2 空白字符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。

3 非空白字符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同","分开。

首先我们来看一下格式化说明符“%d”,从键盘输入一个十进制整数,当多个输入时,采用一个或多个空格做为分隔符,看下面的例子:

运行结果如下:

分析如下:
        scanf格式化输入中有多个空格和’ ’,但是我们采用的是%d格式化输入,所以空格和’ ’等转义字符是没有读入的,这里有一个”%*3d”,意思是跳过输入的前三个整型数字,从第四个数字开始读入,所以我们输入“432432432”,输出的却是432432,而不是432432432. 有同学就要问了,为什么输入“432432432”后还有输入一个字母’d’呢?其实这个地方输入任何一个非空字节都是可以的。因为scanf必须从缓冲区读入一个非空字符再回车才会刷新缓冲区,这里scanf已经把“432432432”读入变量,缓冲区里就为空了,所以必须输入一个非空字节,这样按回车才会结束scanf输入。

好,下面我们来看”%c”,还是先写一个例子:

 

运行结果如下:

分析:
        这里一目了然,采用“%c”输入时,scanf不仅会读入非空字符,遇到空字符他也会读入。 再看一个例子:

#include  
        void main()
        {
          char a,b;
          printf("input character a,b\n");
          scanf("%c %c",&a,&b); /*注意两个%c之间有个空格*/
          printf("\n%c%c\n",a,b);
        }

本例表示scanf格式控制串"%c %c"之间有空格时,输入的数据之间可以有空格间隔。这时候我们应该这样输入’a’空格’b’。

下面看一下”%s”,遇到空格换行等转义字符不读入,

运行结果如下:


scanf()这个函数的函数原型是:int scanf(const char *format,…);这个函数的基本用法这里就不说了,这里介绍一些scanf()函数使用中常见的问题及解决方法

第一,连续输入两个或多个字符的时候,第二次输入直接跳过了如:

int main()
        {
                char a,b;
                scanf(“%c”,&a);
               scanf(“%c”,&b);
                return 0;
        }

输入 a回车 然后就退出了。

这个问题有很多说法有说是缓冲区没有清除,有说stdin这个流的问题,这里我们不去追究,这里介绍几个解决这种问题的方法:

int main()
        {
                char a,b;
                scanf(“ %c”,&a);
                scanf(“ %c”,&b);或 scanf(“ %c”,&b);%c前有空格
                return 0;
        }

这次再编译一下就没有问题了。

第二,使用scanf()函数输入一句话的时候,如:

int main()
        {
                char string[50] ;
                scanf(“%s”,string);
               printf(“%s\n”,string);
                return 0;
        }

输入:hello world!

结果:hello

显然这个结果没有达到我们的要求。

解决方法:

int main()
        {
                char string[50] ;
                scanf(“%[^\n]”,string);
                printf(“%s\n”,string);
                return 0;
        }

重新编译一下,没有问题了吧!

这里如果要是连续输入多个语句的话也会出现连续输入字符的那种问题,当然解决方法也相同了。

来源:华清远见嵌入式培训资料


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

利用 SMFA 系列非对称 TVS 二极管实现高效 SiC MOSFET 栅极保护

Matter更新可能最终会让您无需设置智能家居

自研芯片进展顺利 苹果有望先后摆脱高通博通

苹果AI传将随iOS 18.6在中国上线 阿里巴巴、百度技术支持

设计指南-热功率器件设计中的几点思考

人形机器人2026年迎来全面商业化

机器人 2025-05-09

芯片的先进封装会发展到4D?

EDA/PCB 2025-05-09

测量射频电路

视频 2011-10-17

设计指南-低功耗压力传感器

鸿海传捷报、博世陷干旱 车用一级供应商\"王朝更迭\"?

汽车电子 2025-05-09

高频电子教案(部分)

资源下载 2007-02-09

跟我学数字电子技术

既然有USB摄像头,我们为什么要MIPI摄像头

网络与存储 2025-05-09

高速模拟电路设计技术

资源下载 2007-02-09

各种视频插头插座接口介绍(引脚定义)

押注Rapidus 日本2nm芯片制造试产

EDA/PCB 2025-05-09

设计指南-空间限定的集成FET的DC - DC转换器

视频 2011-10-18

新型高电压精密放大器--业界最精确的SPICE模型

视频 2011-10-17

高频放大电路知识讲解

资源下载 2007-02-09

关税削减,英飞凌德累斯顿晶圆厂终获10亿欧元资金

更多 培训课堂
更多 焦点
更多 视频

技术专区