05-第4章复习题答案
A.4 第4章复习题答案
1.程序不能正常运行。第1个 scanf() 语句只读取用户输入的名,而用户输入的姓仍留在输入缓冲区中(缓冲区是用于存储输入的临时存储区)。下一条 scanf() 语句在输入缓冲区查找重量时,从上次读入结束的地方开始读取。这样就把留在缓冲区的姓作为体重来读取,导致 scanf() 读取失败。另一方面,如果在要求输入姓名时输入 Lasha 144 ,那么程序会把 144 作为用户的体重(虽然用户是在程序提示输入体重之前输入了144)。
2.a. He sold the painting for $234.50.
b. Hi! (注意,第1个字符是字符常量;第2个字符由十进制整数转换而来;第3个字符是八进制字符常量的ASCII表示)
c. His Hamlet was funny without being vulgar.
has 42 characters.
d. Is 1.20e+003 the same as 1201.00?
3.在这条语句中使用\": printf("\"%s\"\nhas %d characters.\n", Q, strlen(Q));
4.下面是修改后的程序:
#include <stdio.h> /* 别忘了要包含合适的头文件 */
#define B "booboo" /* 添加#、双引号 */
#define X 10 /* 添加# */
int main(void) /* 不是main(int) */
{
int age;
int xp; /* 声明所有的变量 */
char name[40]; /* 把name声明为数组 */
printf("Please enter your first name.\n"); /* 添加\n,提高可读性 */
scanf("%s", name);
printf("All right, %s, what's your age?\n", name); /* %s用于打印字符串*/
scanf("%d", &age); /* 把%f改成%d,把age改成&age */
xp = age + X;
printf("That's a %s! You must be at least %d.\n", B, xp);
return 0; /* 不是rerun */
}
5.记住,要打印 % 必须用 %% :
printf("This copy of \"%s\" sells for $%0.2f.\n", BOOK, cost);
printf("That is %0.0f%% of list.\n", percent);
6.a. %d
b. %4X
c. %10.3f
d. %12.2e
e. %-30s
7.a. %15lu
b. %#4x
c. %-12.2E
d. %+10.3f
e. %8.8s
8.a. %6.4d
b. %*o
c. %2c
d. %+0.2f
e. %-7.5s
9.a. int dalmations;
scanf("%d", &dalmations);
b. float kgs, share;
scanf("%f%f", &kgs, &share);
(注意:对于本题的输入,可以使用转换字符e、f和g。另外,除了%c之外,在%和转换字符之间加空格不会影响最终的结果)
c. char pasta[20];
scanf("%s", pasta);
d. char action[20];
int value;
scanf("%s %d", action, &value);
e. int value;
scanf("%*s %d", &value);
10.空白包括空格、制表符和换行符。 C 语言使用空白分隔记号。 scanf() 使用空白分隔连续的输入项。
11. %z 中的 z 是修饰符,不是转换字符,所以要在修饰符后面加上一个它修饰的转换字符。可以使用 %zd 打印十进制数,或用不同的说明符打印不同进制的数,例如, %zx 打印十六进制的数。
12.可以分别把(和)替换成{和}。但是预处理器无法区分哪些圆括号应替换成花括号,哪些圆括号不能替换成花括号。因此,
#define ( {
#define ) }
int main(void)
(
printf("Hello, O Great One!\n");
)
将变成:
int main{void}
{
printf{"Hello, O Great One!\n"};
}