scanf函数到底怎么读取数字?

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函数使用“*”修饰符则将会跳过该次读取。

学习编程之路,多多练习是唯一捷径,但遇到错误要及时查证才是快速成长的方法。

  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值