第1章 导言

1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
int c;
int flag = 0;
while((c = getchar()) != EOF){
if(c == ' '){
if(flag == 0)
{
putchar(c);
flag = 1;
}
}
else{
flag = 0;
putchar(c);
}
}
}

1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,将回退符替换为\b,将反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main(){
int c;
while((c = getchar()) != EOF){
if (c == '\t')
{
putchar('\\');
putchar('t');
}
else if(c == '\b')
{
putchar('\\');
putchar('b');
}
else if(c == '\\')
{
putchar('\\');
putchar('\\');
}
else
putchar(c);
}
return 0;
}

1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXLEN 20

int main(){
int status = OUT;
int data[MAXLEN] = {0};
int c, nc = 0;
while((c = getchar()) != EOF){
if(c == ' ' || c == '\t' || c == '\b'){
status = OUT;
++data[nc];
nc = 0;
}
else if(status == OUT)
{
status = IN;
++nc;
}
else{
status = IN;
++nc;
}
}
for(int i = 0; i < MAXLEN; ++i){
printf("len %d: ", i);
for(int j = 0; j < data[i]; ++j)
printf("-");
printf("\n");
}
return 0;
}