1月9日 C Primer Plus学习
笔记
4.4.5 使用scanf()
printf()函数使用变量、常量和表达式,而scanf()函数使用指向变量的指针。
-
如果用scanf()读取基本变量类型的值,在变量名前加上一个&
-
如果用scanf()把字符串读入字符数组中,不要使用&
根据%c ,scanf()会读取每个字符,包括空白
对float 类型和double 类型,printf()都使用%f 、%e 、%E 、%g 和%G 转换说明,
而scanf()只把它们用于float 类型,double 类型要使用l 修饰符
| 修饰符 | 含义 |
|---|---|
| * | 抑制赋值 |
| 数字 | 最大字段宽度 |
| hh | 把整数作为signed char 或unsigned char类型读取 |
| ll | 把整数作为long long 或unsigned long long 类型读取 |
| j | 在整型转换说明后面时,表明使用 intmax_t 或uintmax_t 类型 |
| t | 在整型转换说明后面时,表明使用表示两个指针差值的类型 |
| z | 在整型转换说明后面时,表示sizeof 的返回类型 |
1. 从scanf()角度看输入
根据%d转换说明,scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第一个非空白字符才开始读取。如果遇到一个非数字字符,它便认为读取到了整数的末尾。然后,scanf()把非数字字符放回输入,这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。
如果使用字段宽度,scanf()会在自读结尾或第一个空白字符处停止读取
如果第一额非空白字符是字母而不是数字,scanf()会停下,并把字母放回输入中,不会把值赋给指定变量。程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。如果程序只使用%d 转换说明,scanf()就一直无法越过这个字母读取下一个字符。
使用%s 转换说明,scanf()会读取除空白以外的所有字符
scanf()能读取不同类型的数据
2. 格式化字符串中的普通字符
除了%c,其他转换说明都会自动跳过待输入值前面所有的空白
3. scanf()的返回值
scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。
当scanf()检测到“文件结尾”时,会返回EOF (EOF 是stdio.h 中定义的特殊值,通常用#define指令把EOF 定义为-1 )。
4.4.6 printf() 和scanf() 的* 修饰符
printf()中可以用* 修饰符代替字段宽度,但还是要用一个参数告诉函数,字段宽度应该是多少。
scanf()中把* 放在% 和转换字符之间时,会使得scanf() 跳过相应的输入项。
4.4.7 printf() 的用法提示
使用足够大的固定字段宽度可以让输出整齐美观。
在两个转换说明中间插入一个空白字符,可以确保即使一个数字溢出了自己的字段,下一个数字也不会紧跟该数字一起输出。
如果要在文字中嵌入一个数字,通常指定一个小于或等于该数字宽度的字段会比较方便。
练习
C Primer Plus 4.8第7题
点击查看代码
#include<stdio.h>
#include<float.h>
void main()
{
double oneThird = 1.0/3.0;
float OneThird = 1.0/3.0;
printf("float: %.6f \ndouble: %.6lf \nfloat: %.12f \ndouble: %.12lf \nfloat: %.16f \ndouble: %.16lf \nFLT_DIG: %d \nDBL_DIG: %d",OneThird,oneThird,OneThird,oneThird,OneThird,oneThird,FLT_DIG,DBL_DIG);
}
C Primer Plus 4.8 第8题
点击查看代码
#include<stdio.h>
#define TOLITRE 3.785
#define TOKM 1.609
void main()
{
printf("请输入旅行的里程(英里):\n");
float range;
scanf("%f",&range);
printf("请输入消耗的汽油(加仑):\n");
float oil;
scanf("%f",&oil);
printf("\n每加仑汽油行驶的英里数: %1.f(英里每加仑) \n每100公里消耗的汽油: %.1f(升每100公里)",range/oil,oil*TOLITRE*100/range/TOKM);
}
浙公网安备 33010602011771号