标签 库函数 下的文章
最近写一个小程序需要用到scanf()函数,发现scanf()函数虽然简单,但是使用起来还是有点小困难,这里我就结合自己的使用以及网上的一些内容,讲一些关于scanf()函数的小知识,博主觉得还是挺有用的哦。scanf函数与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。1、基本说明scanf函数调用形式为: scanf(“<格式说明字符串>”,<变量地址>);变量地址要求有效,并且与格式说明的次序一致。(1)、格式说明符转换字符(就是%后跟的部分)a 读浮点值(仅适用于 C++)A 读浮点值(仅适用于 C++)c 读单字符d 读十进制整数i 读十进制、八进制、十六进制整数e 读浮点数E 读浮点数f 读浮点数F 读浮点数(仅适用于 C++)g 读浮点数G 读浮点数o 读八进制数s 读字符串x 读十六进制数X 读十六进制数p 读指针值n 至此已读入值的等价字符数u 读无符号十进制整数[ ] 扫描字符集合% 读 % 符号(百分号)格式说明符的修饰符说明L/l 长度修饰符 输入”长”数据h 长度修饰符 输入”短”数据W 整型常数 指定输入数据所占宽度* 表示本输入项在读入后不赋值给相应的变量(2)、空白符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。控制串中的空白符使scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符(tab)和新行符(newline)。本质上,控制串中的空白符使scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。(3)、非空白符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。非空白符使scanf()在流中读一个匹配的字符并忽略之。例如,”%d,%d”使 scanf()先读入一个整数,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf()返回。说明:1)、百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。因此,scanf(“%d%*c%d”,&x,&y); 对10/20的读入操作中,10放入变量 x,20放入 y,’/’不保存。2)、虽然空格、制表符和新行符都用做域分割符号,但在读单字符操作中却按一般字符处理。例如,对输入流”x y“调用:scanf(“%c%c%c”,&a,&b,&c);返回后,x在变量a中,空格在变量b中,y在变量c中。3)、控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。例如,给定输入流”10t20“,调用:scanf(“%dt%d”,&x,&y); 将把10和20分别放到x和y中,t被放弃,因为t在控制串中。2、scanf()函数中%[]格式控制符用法此格式控制符的基本格式为:%[scanfset]scanfset 有两种形式:a、一种是以非“^”字符开头的scanset,表示在读入字符串时将匹配所有在scanfset中出现的字符,遇到非scanfset中的字符时输入就结束;b、另外一种形式是以“^”字符开头的scanfset,表示在读入字符串时将匹配所有不在scanfset中出现的字符,遇到scanfset中的字符输入就结束。scanfset中的’-’连接符:当“-”出现在scanfset中且两边都有字符时,大多数编译器都做了如下所述实现:“-”表示匹配从其左边的字符到右边字符之间所有的字符(按ASCII码排序)。如a-z表示a到z的所有字符,又如0-9表示0到9这十个数字。所以,当scanfset为0-9时表示只匹配数字串,当scanfset为A-Za-z时表示只匹配字母(包括大小写),当scanfset为^0-9时不匹配所有数字。注意:“-”的字符只有在其左右两边都有有效字符时才有这个作用,否则被认为是普通字符,如“0-4-6-9”匹配的字符为{0,1,2,3,4,-,6,7,8,9},这样也为输入“-”字符提供了方法。例1:遇到非小写字母输入结束例2:遇到回车键输入结束当要匹配右侧’]’或者’^’时,得这样去做。如果是右侧方括号时,得把它放在紧跟在左侧方括号的后边,也不可以有空格,如:%[]ajdfidfj ];如果是’^’时,把它放在除了紧跟在左侧方括号后边的其它位置,如:%[ gfadhfu^fhgiu ] 。例3:匹配’[’和’^’可用上述代码输入: a]bc^e fg,由于e与fg之间有空格,空格不属于scanfset中的字符,因此输入就结束了,程序打印出a]bc^e。3、如何让scanf()函数正确接受有空格的字符串?如何让scanf()函数正确接受有空格的字符串?如: I love you!上述程序并不能达到预期目的,scanf()扫描到”I”后面的空格就认为对str的赋值结束,并忽略后面的”love you!”。这里要注意是”love you!”还在stdin流中(关于这个问题,网上我所见的说法都是在键盘缓冲区,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的开始部分),请看下面的程序:4、用“空格符”来处理缓冲区残余信息例1:没使用空格控制符输出:0 1 2 3 4 ,数字加空格正好为10,和程序中scanf函数执行了10次是匹配的。例2:使用了空格控制符那么为什么例2就正确呢,原因何在,在%前面加一个空格就这么有用,答案是肯定的,就是%前面的空格在起作用,在scanf的使用过程中应注意的问题中(这些内容在下面)已经指出:“scanf()的格式控制串可以使用空白字符或其它非空白字符,使用空白字符会使scanf()函数在读操作中略去输入中的零个或多个空白字符。”5、使用scanf函数应注意的问题1)、对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。2)、可以在格式化字符串中的”%”各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。3)、scanf()函数中没有精度控制。如:scanf(“%5.2f”,&a); 是非法的。不能企图用此语句输入小数为2位的实数。4)、scanf中要求给出变量地址,如给出变量名则会出错如:int a;scanf(“%d”,a);是非法的,应改为scanf(“%d”,&a);才是合法的。5)、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。6)、在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符如:scanf(“%c%c%c”,&a,&b,&c);输入:d e f则把’d’赋予a, ‘ ‘(空格)赋予b,’e’赋予c。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把’ ‘作为下一个字符送给b。只有当输入为:def(字符间无空格)时,才能把’d’赋于a,’e’赋予b,’f’赋予c。如果在格式控制中加入空格作为间隔:如:scanf(“%c %c %c”,&a,&b,&c); 则输入时各数据之间可加空格。7)、如果格式控制串中有非格式字符则输入时也要输入该非格式字符。如:scanf(“%d,%d,%d”,&a,&b,&c);其中用非格式符 ’,’ 作间隔符,故输入时应为:5,6,7又如:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);则输入应为:a=5,b=6,c=76、小程序这个小程序主要完成对输入的一系列数据进行求和:
今天给大家讲讲如何在Keil下建立STM32的库函数工程,还不会的博友们,可以来看看,带图教程哦。。。好了,废话不多说,直接进入今天的主题吧。注:在看这个教程之前,先到教程底部把文件下载了,待会要用的哟。1、在桌面上创建Test文件夹,并且在Test文件夹下面创建如下图所示文件注: CORE用来存放核心文件和启动文件; OBJ是用来存放编译过程文件以及hex文件; LIB用来存放 ST 官方提供的库函数源码文件; USER目录除了用来放工程文件外,还用来存放主函数文件main.c,以及其他包括 system_stm32f10x.c等等。2、打开Keil创建工程(1)、点击 Keil的菜单:Project–>New Uvision Project,然后将目录定位到刚才建立的文件夹Test之下的USR目录,工程命名为Test,点击保存:(2)、接下来会出现一个选择Device的界面,就是选择我们的芯片型号,这里我们定位到STMicroelectronics下面的STM32F103ZE(这是我使用的STM32芯片的型号,如果你是其他芯片,请选择对应的型号即可),点击OK按钮:(3)、弹出如下图对话框,我们选择”否”:3、将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面上面已经创建好了一个工程,接下来就需要将将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。(1)、打开官方固件库包,定位到我们准备好的固件库包的目录 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下面,将目录下面的src,inc文件夹拷贝到我们刚才建立的LIB文件夹下面。注:src存放的是固件库的.c文件,inc存放的是对应的.h文件。(2)、打开官方固件库包,定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下面,将文件core_cm3.c和文件core_cm3.h复制到CORE下面去。然后定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下面,将里面startup_stm32f10x_hd.s文件复制到CORE下面。现在我们的CORE文件夹下面的文件如下:注:对于103系列,主要是用其中3个启动文件(请根据你的芯片容量选择):startup_stm32f10x_ld.s:适用于小容量产品(flash≤32K)startup_stm32f10x_md.s:适用于中等容量产品(64K≤flash≤128K)startup_stm32f10x_hd.s:适用于大容量产品(flash≥256K)(3)、打开官方固件库包,定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下面,将里面的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的USER目录之下。然后将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下面的 4 个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到USER目录下面至此我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。4、工程相关配置(1)、右击Source Group 1,点击Remove Group 'Source Group 1’ and its Files,弹出的对话框选择”是”,如下图:右击Target,点击Add Group,设置其名为USR,如下图:按照上述步骤,添加LIB,CORE,如下图:(2)、下面我们往Group里面添加我们需要的文件右击USR,点击Add Existing Files to Group‘USR'...,在USR目录下,添加所有的.c文件:按照上述操作,将CORE目录下的.c文件与.s文件添加到CORE组中;将LIB目录下的src文件中你用得到的.c文件添加到LIB组中,这里我都添加进去:添加完成后,各个组中的文件如下图:(3)、点击Keil中的图标,然后点击“Output”选项下面的“Select folder for objects...”,然后选择目录为我们上面新建的OBJ目录,并且勾选Create HEX File;接着点击“Listing”选项下面的“Select folder for Listings...”,然后也选择我们上面新建的OBJ目录:(4)、点击Keil中的图标,然后点击c/c++选项.然后点击Include Paths右边的按钮。弹出一个添加path的对话框,然后我们将上面的3个目录添加进去,将”STM32F10X_HD,USE_STDPERIPH_DRIVER”(逗号是英文状态下的逗号)输入到Define 输入框里面,具体如下图:注:你用的是中容量那么STM32F10X_HD修改为STM32F10X_MD,小容量修改为STM32F10X_LD然后点击OK退出。5、编译程序点击下图所示的编译图标,编译程序:上述程序实现了PA0高低电平的切换,其仿真结果如下图: 好了至此,基于Keil的STM32的库函数工程建立完了,大家如果还有什么不明白的,可以留言提问。 这里是我建立的工程及官方库函数,请下载:点此下载
- 1
本站信息
目前本站共被浏览 162786 次
目前本站已经运行 3508 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
目前本站已经运行 3508 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
最新评论
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla