第1章-导言-习题1.8-1.12

前面习题比较简单,根据教材就可以做出来,下面记录从习题1.8开始。

1.8

 1 #include<stdio.h>
 2
 3 /* 16/6/8 count blanks,tabs,and newlines*/
 4 main()
 5 {
 6     int c, num_blank, num_tab, num_new;
 7
 8     num_blank = num_tab = num_new = 0;
 9     while ((c = getchar()) != EOF) {
10         if (c == ‘ ‘) num_blank++;
11         else if (c == ‘\t‘) num_tab++;
12         else if (c == ‘\n‘) num_new++;
13     }
14     printf("%d %d %d", num_blank, num_tab, num_new);
15 }

1-8.c

初始化语句是有必要的,否则输入语句后按下Enter会出错。

我原先用C语言写C51单片机程序时,对于初值为0的变量通常是直接设置变量名就完事(C51编译器会默认赋值为0),这也给我一个提醒:对于一个新定义的变量,若有必要最好加上初值。

1.9

我的思路很简单,先由c=getchar()读取一个字符,如果是连续空格的话就不断读入到下一个非空格字符为止,不是的话就直接打印该字符。

 1 #include<stdio.h>
 2
 3 /* 16/6/8 repacing string of blanks with a single blank */
 4 main()
 5 {
 6     int c;
 7
 8     while ((c = getchar()) != EOF) {
 9         if (c == ‘ ‘) {
10             while ((c = getchar()) == ‘ ‘);
11             putchar(‘ ‘);
12             putchar(c);
13         }
14         else putchar(c);
15
16     }
17 }

1-9.c

答案给出了三种写法,亮点是设置整型变量lastc来记录前一个输入字符,开始时将其初始化为符号常量NONBLANK(可通过define设置为任意的非空格字符)。下面给出答案的第三种写法(稍微难理解点)

 1 #include<stdio.h>
 2 #define NONBLANK ‘a‘
 3
 4 /* 16/6/15 repacing string of blanks with a single blank */
 5 main()
 6 {
 7     int c;
 8     int lastc;
 9
10     lastc = NONBLANK;
11     while ((c = getchar()) != EOF) {
12         if (c != ‘ ‘ || lastc != ‘ ‘)
13             putchar(c);
14         lastc = c;
15     }
16 }

1-9-a.c

1-10

 1 #include<stdio.h>
 2
 3 /* 16/6/8 replace tab,backspace,backslash with the \* form */
 4 main()
 5 {
 6     int c;
 7
 8     while ((c = getchar()) != EOF) {
 9         //if (c == ‘\t‘) putchar(‘\\t‘);
10         if (c == ‘\t‘) printf("\\t");
11         else if (c == ‘\b‘) printf("\\b");
12         else if (c == ‘\\‘) printf("\\\\");
13         else putchar(c);
14     }
15 }

1-10.c

刚开始使用类似putchar(‘\\t‘)的形式,输出结果如下

换成printf才达到预期效果,注意在C语言中反斜号是用‘\\‘来表示的,要想输出两个反斜号,需要使用printf输出字符串"\\\\"(应该是前面\\输出一个\,然后后面\\再输出一个\)。

1-11

查看答案即可,要点是满足边界条件的输入,比如没有输入、没有单词(只有空格、制表符或换行符)、每个单词各占一行(没有空格和制表符)、单词出现在一串空格之后。

1-12

在教材P14例程基础上写的,思路是当前读到的字符在单词里面(state=IN)的话就打印出来,一直到下一个空格/制表符/回车符为止,并打印回车符\n另起一行。

 1 #include<stdio.h>
 2
 3 #define IN 1
 4 #define OUT 0
 5
 6 /* 16/6/8 以每行一个单词的形式输出 */
 7 main()
 8 {
 9     char state = OUT;
10     char c;
11
12     while ((c = getchar()) != EOF) {
13         if (c == ‘ ‘ || c == ‘\t‘ || c == ‘\n‘) {
14             state = OUT;
15         }
16         else if(state == OUT) {
17             state = IN;
18         }
19         while (state == IN) {
20                 putchar(c);
21                 c = getchar();
22                 if (c == ‘ ‘ || c == ‘\t‘ || c == ‘\n‘) {
23                     state = OUT;
24                     putchar(‘\n‘);
25                 }
26         }
27     }
28 }

1-12.c

答案写的更好一些,这里放上源代码体会一下。

 1 #include<stdio.h>
 2
 3 #define IN 1
 4 #define OUT 0
 5
 6 /* 16/6/15 以每行一个单词的形式输出 */
 7 main()
 8 {
 9     char state = OUT;
10     char c;
11
12     while ((c = getchar()) != EOF) {
13         if (c == ‘ ‘ || c == ‘\t‘ || c == ‘\n‘) {
14             if (state == IN) {
15                 putchar(‘\n‘);
16                 state = OUT;
17             }
18         }
19         else if (state == OUT) {
20             state = IN;
21             putchar(c);
22         }
23         else putchar(c);
24     }
25 }

1-12-a.c

时间: 2024-08-27 10:17:27

第1章-导言-习题1.8-1.12的相关文章

第1章-导言-习题1.13-1.23

1-13 先放上自己写的程序,不论是打印水平方向的直方图还是垂直方向的直方图,前提都是先得到单词的长度,然后将该长度在数组nlenth[]对应的元素加1,也就说统计不同长度出现的次数. 1 #include<stdio.h> 2 3 #define IN 1 4 #define OUT 0 5 #define MAXSIZE 10 6 7 /* 16/06/09 打印输入中单词长度的直方图 */ 8 main() 9 { 10 char state = OUT; 11 char c,i; 12

《鸟哥linux》--第十一章课后习题答案

1.在linux上可以找到哪些shell?哪个档案记录可用的shell?儿linux预设的shell是? 1./bin/bash,/bin/tcsh,/bin/csh 2./etc/shells 3.bash,亦即是/bin/bash 2.在shell环境下,有个提示符(prompt),他可以修改吗?要改什么?默认的提示符内容是? 可以修改,改PS1变量,这个PS1的变量默认的内容为:[\[email protected]\h\W]\$ 3.如何显示HOME这个变量 echo $HOME 4.如

C Primer Plus 第十二章课后习题……2015.5.10

第十二章课后习题 1.自动存储 寄存器存储 静态空连接 2.静态空连接 内部链接 外部链接 3.静态外部链接  静态内部链接 4.空连接 5.在声明中使用表面这个变量或函数已经定义过 6.都分配一个具有100个int值的数组,calloc还把每个元素设置为零. 7.daisy全局变量  lily局部变量 8.#include<stdio.h> char color='B'; void first(void); void second(void); int main(void) { extern

第七章 课后习题P206

第七章 课后习题P206 原文地址:https://www.cnblogs.com/chouqiuqiu/p/8857920.html

Python编程快速上手-让繁琐工作自动化 第三章 函数习题及其答案

第三章 函数习题及其答案 1.为什么在程序中加入函数会有好处? 答:函数减少了重复的代码.这让程序更短,更容易阅读,更容易修改. 2.函数中的代码何时执行: 在函数被定义时,还是在函数被调用时? 答:函数中的代码在函数被调用时执行,而不是在函数定义时. 3.什么语句创建一个函数? 答:def语句定义了(创建了)一个函数. 4.一个函数和一次函数调用有什么区别? 答:函数包含def语句和在def子句中的代码.函数调用让程序执行转到函数内,函数调用求值为该函数的返回值. 5.Python程序中有多少

《计算机网络&amp;#183;自顶向下方法》第七版 第三章 课后习题与问题 答案

非官方答案,本人已尽最大努力(包括参考官方答案),使结果正确,如有错误,请大佬指出 正文: 3.1~3.3节 R1 a.如果只是简单想把信件送到,那么所有的头部信息只需要一个目的地址就够了,题目给出端口号四个字节,所有分组的头部那就只需四个字节 此协议规定,运输层的全部任务就是,将应用层的数据,切成最大1196字节的块,把每一块加上目的主机对应程序的端口号,并将得到的分组交付给网络层 在接收方,运输层将网络层报文取回,去掉头部信息,将数据拼接成应用层需要的信息,根据端口号交付给应用层即可 不过话

【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)

2.1 内存地址 逻辑地址:段+偏移 线性地址(虚拟地址) 物理地址 2.2硬件中的分段 2.2.1 段选择符和段寄存器 15                                                3  2  1   0 ------------------------------------------------|                                                    |TI |RPL  ||         索引号 

【TIJ4】第五章全部习题

第五章习题 5.1 1 package ex0501; 2 //[5.1]创建一个类,它包含一个未初始化的String引用.验证该引用被Java初始化成null 3 4 class TestDefaultNull 5 { 6 public String string; 7 } 8 9 public class DefaultNull 10 { 11 public static void main(String[] args) 12 { 13 TestDefaultNull test = new

第1章-导言-1.1~1.5知识点

第1章是导言部分,内容相对简单,可以快速阅读一遍,并适当做一些练习,等学完后面章节再回头做剩余的练习.下面将简单记录几个重要的知识点: 1.1-1.3 (1)[P2]C语言程序都是由函数和变量组成的,函数中包含一些语句statement,用以执行一些操作:变量则是用于存储操作过程中需要使用的值: (2)[P5]提到了程序的规范性写法,需要注意的是 ①Tab对应的是四个空格(而不是我以为的三个): ②操作符两边加空格与操作数隔离开来(我一直不加空格): (3)[P6]printf的格式化输出用法可