在c库中包含了很多输入函数,scanf()是最通用的一个,因为它可以读取不同格式的数据。scanf()使用空白(换行符,制表符,空格)把输入分成多个字段。依次把转换说明和字段匹配时跳过空白。但是在字符的转换说明时。根据%c,scanf()会读取每个字符,包括空白。
关于scanf()函数我们要知道以下几点:
1、用户输入的字符,会以ASCII码形式存储在键盘缓冲区;
2、每调用一次scanf函数,就从键盘缓冲区读走一个字符,相当于清除缓冲区;
3、若用户一次输入n个字符,则前n次调用scanf函数都不需要用户再次输入,直到把缓冲区的数据全部读取(清除)干净;
4、调用scanf()函数时,用户最后输入的回车也会储存在键盘缓冲区;
————————————————
#include <stdio.h>
int main(void) {
int age;
float asset;
char pet[30]; //字符数组用于存储字符串
printf(“Enter your age, asset, and favorite pet.\n”);
scanf("%d %f", &age, &asset);
scanf("%s", pet);
printf("%d $%.2f %s\n", age, asset, pet);
return 0;
}
Enter your age, asset, and favorite pet.
38
52.22
alle
38 $52.22 alle
/scanf使用空白(换行符、空格、制表符)将输入分成多个字段,在依次
把转换说明和字段匹配时候跳过空白/
从scanf 角度看输入
scanf如何读取输入,假设scanf根据一个%d转换说明读取一个整数,scanf每次读取一个字符,都跳过所有的空白字符,直到遇到第一个非空白字符才开始读取。
因为要读取整数,所以scanf希望发现一个数字字符或者一个符号,它便保存该字符,并读取下一个字符,直到遇到一个非数字字符,它便认为是读到了整数的末尾
然后,scanf把非数字字符放回输入。这意味着下次程序在下一次读取输入时候,首先读到 上一次读取丢弃的非数字字符。
最后scanf计算已读取数字相应的数值,并将计算后的值放到指定的变量中。
如果使用字段宽度,scanf会在字段结尾或者第一个空白字符 处停止读取
如果第一个非空白字符时A而不是数字,scanf会停在那里,并将A放回到输入中,不会将值赋给指定变量
scanf的格式化字符串中的普通字符
scanf函数允许普通字符放在格式化字符串中
如在两个转换说明中添加一个逗号
scanf("%d,%d", &a,&m);
用户需要按照88,11这样的格式的输入
格式字符串中的空白意味着跳过下一个输入项前面的所有空白
scanf(" %c", &a);即使%C会读取空格字符,但是前面有空格,该语句会从第一个非空白字符读取
scanf返回值
返回成功读取的项数,如果要读取一个数字,你读取了一个字符,则会返回
修饰符,对于prinf函数来说,可以用修饰符代替字段宽度,但是还是需要一个参数告诉函数,字段宽度应该是你多少
也就是说,如果转换说明是%d,那么参数列表中应包含和d对应的值
#include <stdio.h>
int main(void){
unsigned width, precision;
int number = 256;
double weight = 242.5;
printf("Enter a field width\n");
scanf("%d", &width);
printf("The number is :%*d:\n", width, number);
printf("Now enter a width and a precision:");
scanf("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight);
printf("Done\n");
return 0;
}
scanf()中的用法不一样,把放在%和转换字符之间,会使得scanf跳出相应的输出项
scanf("%*d %d", &precision);
跳过第一个,将第二个输入的整数赋予给precision