scanf()函数格式字符串普通字符与转换说明输入分析

本文详细探讨了scanf()函数如何处理输入,包括%d转换说明读取整数的机制,字段宽度的影响,以及如何处理非数字字符。转换说明如%x用于读取十六进制数,%s读取字符串时会忽略空白并添加''作为结束符。普通字符在格式字符串中的位置和空白字符的处理也会影响输入的匹配。总结指出,除空格外的普通字符和%c转换说明前有空格时,输入是自由的,否则需要严格匹配格式。
摘要由CSDN通过智能技术生成

(来源 C Primer Plus page221)
一、从scanf()角度看输入
接下来,我们更详细地研究scanf()怎样读取输入。假设scanf()根据一个%d转换说明读取一个整数。scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。因为要读取整数,所以scanf()希望发现一个数字字符或者一个符号(+或-)。如果找到一个数字或符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。scanf()不断地读取和保存字符,直至遇到非数字字符。如果遇到一个非数字字符,它便认为读到了整数的末尾。然后,scanf()把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。
如果使用字段宽度,scanf()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停止)。
如果第1个非空白字符是A而不是数字,会发生什么情况?scanf()将停在那里,并把A放回输入中,不会把值赋给指定变量。程序在下一次读取输入时,首先读到的字符是A。如果程序只使用%d转换说明, scanf()就一直无法越过A读下一个字符。另外,如果使用带多个转换说明的scanf(),C规定在第1个出错处停止读取输入。
用其他数值匹配的转换说明读取输入和用%d 的情况相同。区别在于scanf()会把更多字符识别成数字的一部分。例如,%x转换说明要求scanf()识别十六进制数a~f和A~F。浮点转换说明要求scanf()识别小数点、e记数法(指数记数法)和新增的p记数法(十六进制指数记数法)。
如果使用%s 转换说明,scanf()会读取除空白以外的所有字符。scanf()跳过空白开始读取第 1 个非空白字符,并保存非空白字符直到再次遇到空白。这意味着 scanf()根据%s 转换说明读取一个单词,即不包含空白字符的字符串。如果使用字段宽度,scanf()在字段末尾或第1个空白字符处停止读取。无法利用字段宽度让只有一个%s的scanf()读取多个单词。最后要注意一点:当scanf()把字符串放进指定数组中时,它会在字符序列的末尾加上’\0’,让数组中的内容成为一个C字符串。

scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。
除了%c,其他转换说明都会自动跳过待输入值前面所有的空白。

#include <stdio.h>
int main(void)
{
   
	int age; // 变量
	float assets; // 变量
	char pet[30]; // 字符数组,用于储存字符串
	printf("Enter your age, assets, and favorite pet.\n");
	scanf("%d %f", &age, &assets); // 这里要使用&
	scanf("%s", pet); // 字符数组不使用&
	printf("%d $%.2f %s\n", age, assets, pet);
	getchar();/*方便看结果,根据需要调节数量*/
	getchar();
	getchar();
	return 0;
}
/*格式字符串两数据间使用空格或者使用多个scanf()函数分别输入数据时,输入形式较自由,可以
随意使用空白。scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转
换说明和字段匹配时跳过空白。
vs2017输入输出结果:
Enter your age, assets, and favorite pet.
  18
 89640.763
	 panda
18 $89640.77 panda
*/

/*数据不匹配时输出结果,程序只读取了Panda这个输入
vs2017输入输出结果:
Enter your age, assets, and favorite pet.
Panda 18  5634.12
-858993460 $-107374176.00 Panda
*/

二、格式字符串中的普通字符
scanf()函数允许把普通字符放在格式字符串中。除空格字符外的普通字符必须与输入字符串严格匹配。
1、scanf()中除c%外的其它转换说明
两数据之间只有空格:(输入方式自由,可随意使用空白)

#include <stdio.h>
int main(void)
{
   
	int n, m;		
	scanf("%d %d",&n,&m);/*注意在两个输入数据之间使用空格,在输入数据时较自由,可以
	在两个数据之间使用任意数量的空白(换行符、制表符和空格)*/
	printf("**%d**%d**\n",n,m)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值