复习题
C语言在使用scanf()函数读取用户输入的字符串时,如果遇到第一个空白(空格,制表符,换行符),就认定完成数据的读取工作,后续数据不再写入当前变量,而只保存在输入缓冲区。因此读取名的scanf()函数只能够在name[]中存储第一个无空白的连续单纯。在空白之后用户输入的内容依然会保留在输入缓冲区内,等待下一次scanf()函数的输入。因此,程序中并没有等待用户输入体重数据,而直接将刚才缓冲区内的姓赋予体重。最终weight变量存储的数据为0.0。
2.假设下列示例都是完整程序的一部分,它们的打印结果分别是什么?
对这四个输出进行讲解:
第一个输出:这个%2.2f什么意思。
形如%m.nf ,其中m表示输出数据的宽度(如果宽度不够就补空格,如果宽度超过m久用实际宽度);n表示输出的实数保留n位小数;
举个例子:
输出如下
第一个输出在前面补空格让数据宽度达到12,第二个只需要保留小数点后三位就行(四舍五入),第三个不仅需要保留小数点后三位,而且还需要在前面补空格让数据宽度达到12.
输出“He sold the painting for $234.50.”这是浮点数据的格式化输出,%f表明以十进制记数法打印浮点数据,因此,会自动将e记数法转换成十进制,保留小数点后面的两位数字。
第二个输出:输出“Hi!“。打印语句分别用字符型,十进制整型和八进制转义方式打印3个字符。整型十进制数据105对应ASCII字符‘i’,‘\41’中的转义序列表示八进制数据,通常表示八进制时可以写成‘\041’,也可以省略0.直接写成‘\41’.
第三个输出:
预编译指令定义了Q为字符串“His Hamlet was funny without being vulgar.“,打印时会直接通过转换说明符输出该字符串,strlen(Q)函数计算实参字符串Q的长度,即42,并且输出。需要注意的是strlen()函数并没有计算字符串结尾的‘\0’
第四个输出:
Printf()函数打印了两个浮点数,“%e“表示按照e计数法打印,保留小数点后两位数字,
”%2.2f“表示按照普通十进制打印数据,保留小数点后两位数字,如果不够用0补齐。
4.找出下列程序的错误
改正后的程序如下:
5.设一个程序的开头是这样的。
6.打印下列各项内容分别要使用什么转换说明符?
A:一个字段宽度与位数相同的十进制整数;
B:一个形如8A,字段宽度为4的十六进制整数;
C:一个形如232.346、字段宽度为10的浮点数:
D:一个形如2.33e+002、字段宽度为12的浮点数;
E:一个字段宽度为30、左对齐的字符串;
分析与解答;
A:整型数据使用的转换说明符是%d,字段宽度和位数相同不需要使用特殊修饰符,换说明符为%d;
B:十六进制数据的转换说明符(输出大写字符应当使用大写的X)是%X,因为宽使用4作为修饰符。因此转换说明符为%4X;
C;%10.3f
D:%12.2e
E: 字符串使用转换说明符%s,长度为30,左对齐,使用-30修饰符,因此转换说明符为%-30s;
7.打印下面的内容分别使用什么转换说明符?
A;字段宽度为15的unsigned long 类型整数;
B:一个形如ox8a,字段宽度为4的十六进制整数;
C:一个形如2.33E+02、字段宽度为12、左对齐的浮点数;
D:一个形如+232.346、字段宽度为10的浮点数;
E:一个字段宽度为8的字符串的前8个字符;
解析:
A;unsigned 类型整数转换说明符是%u,对于long类型的字段宽度,应添加l修饰符,字段宽度为15,就需要添加15的修饰符,因此转换说明符为%15lu;
B;十六进制整型数据的转换说明符为%x(输出是小写x就小写),输出OX使用#修饰符;字段宽度为4,转换说明符为%#4x;
C;输出科学计数法使用转换说明符%E(输出是大写E就用大写),左对齐,字段宽度为12修饰符为-12,转换说明符为%-12.2E
D:浮点数转换说明符是%f,显示正好使用+修饰符,字符宽度为10,3位小数,使用的转换说明符如下:%+10.3f;
E:字符串转换说明符是%s,字段宽度位8,显示前八个字符使用8.8修饰符,因此转化说明符为%8.8s。
补充:C语言中,%m.ns 的含义:
%s:就是字符串的转换说明符
%ms:输出字符串宽度为m,如果字符串本身实际宽度大于m,那么就用字符串的实际宽度。如果字符串的实际宽度小于m,则左补空格。可以理解成m前面有个省略了的+号,所以字符串右对齐;
%-ms:规则和基本上面一样,不一样的是字符串左对齐,右补空格;
%m.ns;输出宽度占m,但是只取字符串中左端的n个字符。这n个字符排列在m宽度的右侧,如果n小于m则左补空格,如果n大于m,那么m失效,字符的输出宽度就是n。
%-m.ns;规则和上面基本一样,不一样的地方在于,如果n小于m那么需要左对齐,右补空格。
8.打印下面各项内容要分别使用什么样的转换说明符?
A:一个字段宽度为6、最少有4位数字的十进制数;
B:一个在参数列表中给定字段宽度的八进制整数;
C:一个字段宽度为2的字符;
D:一个形如+3.13、字段宽度等于数字中字符数的浮点数;
E:一个字段宽度为7、左对齐的字符串中的前5个字符。
分析与解答:
A:转换说明符为%d,%6.4d;
B:八进制数据使用转换说明符%o,字段宽度由参数列表指定,使用修饰符“*”,因此转换说明符为%*o;
C;%2c
D:%+0.2f;字段宽度为数字中字符数,即不指定字段宽度,小数点后显示两位,使用修饰符+0.2,因此转换说明符为%+0.2f;
E:%-7.5s
9.分别写出读取下列各输入行的scanf()语句,并且声明语句中用到的变量和数组;
A.101;
B.22.32 8.34E-09;
C.linguini;
D.catch 22;
E.catch 22(但是跳过catch)。
分析与解答:
A.输入数据是整型数据,首先定义整型变量i, scanf()函数使用转换说明符%d。
Int dalmations;
Scanf (“%d”,& dalmations);
B. 输入数据有两个浮点型数据,scanf()使用转换说明符%f或者%e %g。
float kgs ,share;
scanf(“%f %f”,&kgs,&share);
C.输入数据为字符串,scanf()函数使用转换说明符%s,需要注意的是,对于字符数组,scanf()函数的参数列表不需要使用&符号。
char pasta[20];
scanf(“%s”,pasta);
D. 输入数据为字符串和整型数据,因此scanf()需要使用%s,%d。
char action[20];
int value;
scanf(“%s %d” , action ,&value);
E. 输入数据为字符串和整型数据,忽略字符串,应当使用“*”修饰字符串转换说明符。
int value;
scanf(“%*s %d”,&value);
10.什么是空白?
C语言中的空白是指空格、制表符、换行符,这三种空白是scanf()函数进行输入分割的符号。
11.下面的语句有什么问题?如何修正?
Printf(“The double type is %z bytes..\n”, sizeof(double));
分析与解答:
百分号(%)后面的z在printf()函数中表示一个修饰符,需要注意的是,修饰符是百分号和转换说明符中间用于表示特定数据类型的符号。修饰符不能单独使用。Z修饰符和整型转换说明符在一起,表示使用sizeof的返回类型——size_t,例如,%zd表示十进制,%zo表示八进制。因此应当修改为%zd,表示打印sizeof的十进制整型数据。
12.假设要在程序中用圆括号替代花括号,以下方法是否能可行?
分析与解答:
C语言中的预编译指令#define语句,可以对相应的符号进行编译时替换,即编译器在对源代码进行编译时进行符号替换。但是例子中的#define语句替换的是c语言中表示语句块和一些重要的语句符号,替换后会导致程序出现语法错误。