cprimer plus 81and 289页关于scanf的详细解释

81页解释:

从scanf()角度看输入 
接下来,我们更详细地研究 scanf()怎样读取输入。假设 scanf ()根据一个%d转换说明读取一个整数。

scanf0函数每次读取一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。

因为要读取整数,所以 scanf()希望发现一个数字字符或者一个符号(+或-)。如果找到一个数字或符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。scanf()不断地读取和保存字符,直至遇到非数字字符。

如果遇到一个非数字字符,它便认为读到了整数的末尾。然后,把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。

最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。

如果使用字段宽度,scanf()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停止)。

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

区别在于 scanf()会把更多字符识别成数字的一部分。例如,%x 转换说明要求 scanf()识别十六进制数 a~f 和 A~F。浮点转换说明要求 scanf()识别小数点、e记数法(指数记数法)和新增的p记数法(十六进制指数记数法)。
       如果使用%s 转换说明scanf()会读取除空白以外的所有字符scanf()跳过空白开始读取第1个非空白字符,并保存非空白字符直到再次遇到空白。这意味着scanf根据%s 转换说明读取一个单词,即不包含空白字符的字符串。如果使用字段宽度,scanf()在字段末尾或第1个空白字符处停止读取。

代码如下:

// scanf详细解释.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
int main(int argc, char* argv[])
{
	char name[10],name2[10];
	int count;
	printf("please enter 2 names.\n");
	count=scanf("%5s %10s",name,name2);
	printf("i read the %d names %s and %s.\n",count,name,name2);

	return 0;
}

 如果使用字段宽度,scanf()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停止)。

 

最后注意一点:当scanf()把字符串放进指利用字段宽度让只有一个%s 的 scanf()读取多个单词。它会在字符序列的末尾加上'\0',让数定数组中的内容成为1个字符串

在C语言中 scanf()并不是最常用的输入函数。这里重点介绍它是因为它能读取不同类型的数据。

此外,C语言中getchar():读取单个字符

fgets():可以读取包含空格字符串,会将换行符放在字符串末尾

无论,程序读取整数,小数,字符还是字符串都可以用scanf函数

82页:

除了%c,其他转换说明都自动跳过待输入只前面所有的空白。

因此,scanf("%d%d",&n,&m);与scanf("%d  %d",&n,&m);的行为相同

对于%c,在格式字符串添加一个空格字符会有所相同。例如:如果在格式字符串中空格在%c前面,scanf会跳过空格,从第1个非空白字符开始读取;举例说明:

scanf("%c",&ch);从输入的第1个字符开始读取

而:scanf("  %c",&ch);从输入的第1个非空白字符开始读取

scanf返回读取成功的项数,检测到文件结尾返回EOF

83页:

但是*对于printf()函数,*可以代替字段宽度,这个技巧可用于指定精度和字段宽度

本小节重点:81页解释

紫色部分重点

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值