C语言scanf()函数

scanf函数

C库包含了多个输入函数,scanf()函数是很通用的一个,因为它可以读取不同格式的数据,当然从键盘输入的都是文本,因为键盘只能生成文本字符:字母、数字、标点符号,如果要输入整数2022,就要键入字符2、0、2、2.如果要将其存储为数值而不是字符串,程序就必须把字符依次转换为数值,这就是scanf函数要做的,scanf()把输入的字符串转换成整数、浮点数、字符或字符串,而printf()正好相反,把整数、浮点数、字符和字符串转换成显示在屏幕上的文本。

scanf()也使用格式字符串和参数列表。

如果用scanf()读取基本变量类型的值,在变量名前加上一个&;

如果用scanf()把字符串读入字符数组中,不要使用&。

%c转换说明,根据%c说明,scanf()会读取每个字节,包括空白。

scanf()函数所用的转换说明与printf()函数几乎相同,主要的区别,对于float类型和double类型,printf()都使用%f %e %E %g %G转换说明,而scanf()只把它们用于float类型,对于double类型要使用l修饰符。

转换说明

含义

%c

把输入解释成字符

%d

把输入解释成有符号十进制整数

%e %f %g %E %F %G

把输入解释成浮点数

%i

把输入解释成有符号十进制整数

%o

把输入解释成有符号八进制整数

%p

把输入解释成指针

%s

把输入解释成字符串,从第一个非空白字符开始,到下一个空白字符之前的所有字符都是输入。

%u

把输入解释成无符号十进制整数

%x %X

把输入解释成有符号十六进制数

scanf()角度看输入

假设scanf()根据一个%d转换说明读取一个整数。scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第一个非空白字符才开始读取,因为要读取整数,所以scanf()希望发现一个数字字符或者一个符号(+或-),如果找到一个数字或符号,它便保存该字符,并读取下一个字符,如果下一个字符是数字,它便保存该数字并读取下一个字符,scanf()不断地读取和保存字符,直至遇到非数字字符,,如果遇到一个非数字字符,它便认为读到了整数的末尾,然后,scanf()把非数字字符放回输入,这意味着程序在下一次读取输入时,首先读到的是上一次读取丢失的非数字字符,最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。

如果第一个非空白字符是A而不是数字,会发生什么情况?scanf()将停在那里,并把A放回输入中,不会把值赋给指定变量,程序在下一次读取输入时,首先读到的字符是A,如果程序只使用%d转换说明,scanf()就一直无法越过A读下一个字符,另外,如果使用带多个转换说明的scanf(),C规定在第一个出错处停止读取输入。

如果要使用%s转换说明,scanf()会读取除空白以外的所有字符,scanf()跳过空白开始读取第一个非空白字符,并保存非空白字符直到再次遇到空白,这意味着scanf()根据%s转换说明读取一个单词,即不包含空白字符的字符串。当scanf()把字符串放进指定数组中时,它会在字符序列的末尾加上’\0’,让数组中的内容为一个C字符串。在C语言中scanf()并不是最常见的输入函数,但它可以读取不同类型的数据。

格式字符串中的普通字符

scanf()函数允许把普通字符放在格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配。例如,假设在两个转换说明中添加一个逗号:

scanf(“%d,%d”,&n,&m);

scanf()函数将其解释成用户将输入一个数字、一个逗号,然后再输入一个数字,也就是说,用户要这样输入:3,4

实践是检验真理的唯一标准!

scanf()的返回值

scanf()函数返回成功读取的项数,如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。

摘录自C Primer Plus

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值