浅谈scanf()函数

来源:互联网 发布:tensorflow查看变量值 编辑:程序博客网 时间:2024/06/03 19:55

一、基础知识

   它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指变量之中。返回值为成功读取数据项的个数。

二、结合缓冲区理解scanf()函数原理

   1、scanf()函数是带有缓冲区的。当在程序执行遇到scanf()函数时,程序会先检查输入缓冲区是否有数据。   2、如果没有,等待用户输入。用户从键盘按下的每一个键(ASCII码)都会被暂时保存到输入缓冲区中,直到用户按下回车键,输入完毕。此时包括回车键也被保存在输入缓冲区中。scanf()函数再从缓冲区中读取数据。如果匹配成功,则赋值给相应的变量并将相应数据从缓冲区中删除。如果匹配失败,则什么也不作,余下的数据依然留在缓冲区中。   3、如果有,则不用用户输入,直接从输入缓冲区读取数据,进行匹配。如果匹配成功,则赋值给相应的变量并将相应数据从缓冲区中删除。如果匹配失败,则什么也不作,余下的数据依然留在缓冲区中。

三、原理示意图

这里写图片描述

四、scanf()函数的格式控制串中的空白符和非空白符

   1、空白符:控制串中的空白符使 scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符(tab)和新行符(newline)。 本质上,控制串中的空白符使 scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。   2、非空白符:控制串中的非空白符使 scanf() 在流中读一个匹配的字符并忽略之。例如,"%d,%d" 使 scanf() 先读入一个整数,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf() 返回。   3、注意:    1)用户在输入数据时中,数据项必须由空格、制表符和新行符分割。回车表示输入完成。逗号和分号等不是分隔符,虽然空格、制表符和新行符都用做域分割符号,但读单字符操作中却按一般字符处理。scanf()函数进行读取数据时,将依次对缓冲区中的数据进行读取,并和格式控制串进行匹配。被匹配的数据都从缓冲区删除,没有被匹配的依然保存在缓冲区。    2)控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。

五、问题

1、用户输入问题(自行解决)2、缓冲区残留信息问题(具体问题具体分析)   例如:循环输入,输入缓冲去残留有'\n'(回车键)问题。        解决方法(下次输入前进行如下一种操作即可):        a)或着修改输入为scanf(" %d", &a);(注意控制串中空格的作用)        b)使用getchar();        c)使用scanf("\n");(注意控制串中非空格符的处理)        d)fflush(stdin)(慎用,移植性差)

六、总结

   使用scanf()函数时,应该注意运行程序时键盘输入的格式以及编程时对键盘缓冲区残留问题的处理。   其他有关scanf()函数信息请   [这里写链接内容](https://baike.baidu.com/item/scanf/10773316?fr=aladdin%20%20%20%22%E7%82%B9%E5%87%BB%E7%A5%A5%E8%A7%81%22)
原创粉丝点击