C Primer Plus 第4章 字符串和格式化输入/输出 复习题

本文详细讨论了C语言中scanf()和printf()函数的使用,包括输入输出异常情况、格式化输出的转换说明、错误修复以及预编译宏的运用。举例说明了输入输出过程中可能出现的问题,如缓冲区处理、格式匹配错误和宏定义的误用,并提供了相应的解决方案。同时,还探讨了如何正确处理包含特殊字符的字符串输出和动态格式化的技巧。
摘要由CSDN通过智能技术生成

提示:以下是本篇文章正文内容,下面案例可供参考


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 ) }
可以,但是预编译器无法区分哪些该换哪些不该换,所有的()都会被替换为{}


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾在学习路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值