scanf函数
对于C语言的初学者来说,printf()函数和scanf()函数是非常重要也是非常好用的两个函数,作为标准输出和输入函数,他们为人机交互提供了通道。并且两个函数做提供的,格式化输入输出方式为程序的可靠性提供了很大保障。
可靠通常意味着复杂,因此这两个函数也为初学者带来不小的学习困难。初学者编写的程序出错时,很多都是由输入输出函数使用不当造成的。输出函数printf还好,出没出错从打印出的字符中一目了然,但是输入的结果我们却不能直接观察,因此经常输入函数使用错误后,系统结果呈现出来的错误报告我们可能都云里雾里,不会直接说scanf函数出错,那为什么程序里的scanf读取的数据老是跟预想的不太一样?
因为大多数的教学机构只会告诉你最基本的scanf函数用法,而且不会告诉你scanf函数的工作步骤。本文将详细描述scanf函数读取数据的步骤。
scanf函数的用法
scanf函数和printf函数都使用格式字符串和参数列表,两者的格式字符串类似,用于指示输入的数据储存类型,参数列表中为存储变量的地址。格式字符串用%前缀修饰,后接转换字符。之间可以添加修饰符。
下面是常用的几个scanf的转换说明
格式字符串 | 类型说明 |
---|---|
%c | 把输入存储为字符 |
%d、%i | 把输入存储为有符号十进制整数 |
%o | 把输入存储为有符号八进制整数 |
%p | 把输入存储为地址 |
%s | 把输入存储为字符串 |
%u | 把输入存储为无符号十进制整数 |
%x | 把输入存储为有符号十六进制整数 |
scanf()读取输入
scanf()函数读取的数据类型如上述有很多,但是主要的可以分为两类,数字和字符。
读取字符输入时,scanf函数会读取每个字符(包括空白字符),但一次只读取一个字符,存储字符的方式通常为ASCⅡ码值。
读取数字的步骤比较复杂。如果以十进制整数形式读取整数,scanf函数依然是每次读取一个字符,注意不是读取一整个数字,但不会马上结束读取进行存储。
首先scanf函数从第一个输入开始检查,它会跳过所有空白字符,直到它发现一个数字或者符号(+或-),它便会保存该字符然后往下读取,如果接下来读取依然是数字,他就会不断地保存然后读取下一个字符直到遇见一个非数字字符,scanf函数认为这里是数字的结尾。
我们都知道scanf()和printf()函数都是从数据流中读取数据,对于结尾的那个字符,scanf函数的做法是,把它放回输入流,这也就意味着下一次读取输入时最先读取的是上一次读取被scanf()函数抛弃的那个字符,这也是常常导致我们的程序出错的主要原因。
如果读取到的第一个非空白字符不是数字也不是正负号的话,scanf函数的做法是放弃这次读取,并将字符放回输入流,留给下一个读取函数。
scanf()函数返回值
scanf函数将会返还读取成功的项数;如果没有读取或者读取是失败,它将会返回0;如果scanf函数检测到文件结尾,会返回EOF,而在stdio.h头文件中,它将EOF定义为-1。
scanf()读取错误常见原因
- scanf函数读取成功结束条件有两个,一个是读取达到指定字宽,一个是读取到空白,两者满足一个就会结束输入。
- 如果scanf输入格式字符串中有指定的格式,那输入必须匹配该格式才能成功输入,比如:
scanf("%d,%d");//这样的输入要求输入的两个整数之间必须要有“,”。
- printf函数和scanf函数都可以使用“*”修饰符,但是功能不一样,printf函数使用该修饰符说明将从参数列表读取字宽修饰符,scanf函数使用“*”修饰符则将会跳过该次读取。
学习编程之路,多多练习是唯一捷径,但遇到错误要及时查证才是快速成长的方法。