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页解释