提示:以下是本篇文章正文内容,下面案例可供参考
1、再次运行程序清单 4.1,但是在要求输入名时,请输入名和姓(根据英文书写习惯,名和姓中间有一个空格),看看会发生什么情况?为什么?
程序不能正常运行。 第1个scanf ()语句只读取用户输入的名, 而用户输入的姓仍留在输入缓冲区中(缓冲区是用千储存输入的临时存储区)。 下一条 scanf ()语句在输入缓冲区查找重量时,从上次读入结束的地方开始读取。 这样就把留在缓冲区的姓作为体重来读取, 导致 scanf ()读取失败。 另一方面, 如果在要求输入姓名时输入 Lasha 144, 那么程序会把 144 作为用户的体重(虽然用户是在程序提示输入体重之前输入了 144)。
2、假设下列示例都是完整程序中的一部分,它们打印的结果分别是什么?
a. printf(“He sold the painting for $%2.2f.\n”, 2.345e2);
b. printf(%c%c%c\n", ‘H’, 105, ‘\41’);
c. #define Q “His Hamlet was funny without being vulgar.”
printf("%s\nhas %d characters.\n", Q, strlen(Q));
d. printf(“ls %2.2e the same as %2.2f?\n”, 1201.0, 1201.0);
a.He sold the painting for $234.50.
b.Hi!
c.His Hamlet was funny without being vulgar.
has 42 characters.
d.Is 1.20e+003 the same as 1201.00?
3、在第2题的c中,要输出包含双引号的字符串Q,应如何修改?
printf("\"%s\" has %d characters.\n", Q, strlen(Q));
4、找出下面程序中的错误
define B booboo
define X 10
main(int)
{
int age;
char name;
printf(“Please enter your first name.”);
scanf("%s", name);
printf(“All right, %c, what’s your age?\n”, name);
scanf("%f", age);
xp = age + X;
printf(“That’s a %s! You must be at least %d.\n”, B, xp);
rerun 0;
}
#include<stduo.h> //合适头文件要加上
#define B "booboo" //加上#和""
#define X 10 //宏定义要有#
main(int)
{
int age;
char name[40];
int xp;//xp没有定义
printf("Please enter your first name.");
scanf("%s", name);
printf("All right, %s, what's your age?\n", name); //%s用于打印字符串
scanf("%d",&age); //age是int型的,要把%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. 假设一个程序的开头是这样:
#define BOOK “War and Peace”
int main(void) {
float cost =12.99;
float percent = 80.0;
请构造一个使用BOOK,cost和percent的printf()语句,打印以下内容:
This copy of “War and Peace” sells for $12.99.
That is 80% of list.
答案:
printf(“This copy of BOOK sells for %f”,cost);
宏定义的值也不能直接用
printf("This copy of \"%s\" sells for %f",BOOK,cost);
printf("That is %f of list",percent);
6. 打印下列各项内容要分别使用什么转换说明?
a. 一个字段宽度与位数相同的十进制整数 %d
b. 一个形如8A、字段宽度为4的十六进制整数 %4x
c. 一个形如232.346、字段宽度为10的浮点数 %10.3f
d. 一个形如2.33e+002、字段宽度为12的浮点数 %12.2e
e. 一个字段宽度为30、左对齐的字符串 %-30s
\\%x 无符号十六进制整数,使用十六进制数0f
7. 打印下面各项内容要分别使用什么转换说明?
a. 一个字段宽度为15的unsigned long整数 %15lu
b. 一个形如0x8a、字段宽度为4的十六进制整数 %4x
c. 一个形如2.33E+02、字段宽度为12、左对齐的浮点数 %-12.2E
d. 一个形如+232.346、字段宽度为10的浮点数 %+10.3f
e. 一个字符串的前8个字符,字段宽度为8字符 %8.8s
//%s 小数点前的数字代表输出的字符所占空间大小。
小数点后的数字代表输出的字符串大小。
8. 打印下面各项内容要分别使用什么转换说明?
a. 一个字段宽度为6、最少有4位数字的十进制整数 %6.4d
b. 一个在参数列表中给定字段宽度的八进制整数 % * o
//在printf中使用,表示用后面的形参替代的位置,实现动态格式输出。
例如:printf("%s",10,s);/意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,这里等同于printf("%10s",s);
c. 一个字段宽度为2的字符 %2c
d. 一个形如+3.13、字段宽度等于数字中字符数的浮点数 %+0.2f
e. 一个字段宽度为7、左对齐字符串中的前5个字符 %-7.5s
9. 分别写出读取下列各输入行的scanf()语句,并声明语句中用到变量和数组。
a. 101
b. 22.32 8.34E-09
c. linguini
d. catch 22
e. catch 22(但是跳过catch)
a.int a;
scanf("%d", &a);
b.float a,b;
scanf("%f %e",&a,&b);
c.char name[40];
scanf("%s",name);
d.char zimo[20];
int a;
scanf("%s %d",zimo,&a);
e.int value;
scanf("%*s %d", &value);
//解释e:在scanf中使用,则添加了的部分会被忽略,不会被参数获取。
例如:int a,b;char b[10];scanf("%d%*s",&a,b);输入为:12 abc那么12将会读取到变量a中,但是后面的abc将在读取之后抛弃,不赋予任何变量(这里的字符数组b)
10. 什么是空白?
包括:空格、制表符和换行符。
C语言用空白分隔记号。
scanf()使用空格分隔连续的输入项。
11. printf(“The double type is %z bytes…\n”, sizeof(double));这个语句有什么问题?如何修正?
%z中的z是修饰符,不是转换字符,要在修饰符后面加上一个它修饰的转换字符。可以使用%zd打印十进制数,或用不同的说明符打印不同进制的数
12.假设要在程序中用圆括号代替花括号,以下方法是否可行?
#define ( {
#define ) }
可以,但是预编译器无法区分哪些该换哪些不该换,所有的()都会被替换为{}