《C程序设计语言》 练习1-21
Posted jerryleesir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C程序设计语言》 练习1-21相关的知识,希望对你有一定的参考价值。
问题描述
编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1 - 20的detab程序的情况相同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好 ?
Write a program
entab
that replaces strings of blanks with the minimum number of tabs and blanks to achieve the same spacing. Use the same stops as for detab
. When either a tab or a single blank would suffice to reach a tab stop, which should be given preference?解题思路
这道题我用了两天才做对,刚开始我是按照1-20的思路来做这个题,但是运行结果不对,于是我就去看答案,不看还好,一看更懵逼了,我看的答案是英文版的(附上网址:https://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_21),作者的思路是直接把固定的8个空格换成制表符,经过1-20的练习,我们知道制表符占据的空格是不唯一的,运行作者的代码也是达不到题目效果,所以我看了中文版的答案,是可以的。
下面我们说一下思路:
(为方便视图,下文中,空格用*代替,制表符所占据的空格就是空格本身)
1.我们需要一个数组来存放我们输入的内容
2.我们要知道同一行两段连续文字中间有多少空格
3.如果产生制表符,则制表符一在空格前面(下面举例说明)
分2种情况:
(1)空格的位置没有经过8的倍数,全部输出空格
(2)空格位置经过了8的倍数,所以位置7、8被制表符占据,剩余三个空格依然是空格
代码实现
#include<stdio.h> #define MAXLEN 1024 #define TAB 8 int getlines(int array[] , int maxlen); int getlines(int array[] , int maxlen)//将输入读入数组,并且在换行时输出结果 { int i,c; for ( i = 0; i < maxlen-1 && (c=getchar())!=EOF && c!=‘ ‘; i++) { array[i] = c; } if (c==‘ ‘) { array[i] = c; i++; } array[i] = ‘ ‘; return i; } int main() { int array[MAXLEN]; int len; int i; int nb=0;//空格计数器 int nt=0;//制表符计数器 while ((len = getlines(array , MAXLEN)) > 0) { for ( i = 0; i < len ; i++) { if (array[i] == ‘ ‘) { //统计同一行两段连续字符中间需要输出多少制表符和空格 if ((i+1)%TAB != 0)//i从零开始,但字符位置从1开始,(i+1)表示当前位置 { nb++; }else { nt++; nb = 0;//制表符永远在空格前面,有了制表符,空格就要清零 } }else { for ( ; nt > 0; nt--) { putchar(‘ ‘); } if (array[i] == ‘ ‘) { nb = 0; }else { for ( ; nb > 0; nb--) { putchar(‘*‘); } } putchar(array[i]); } } } return 0; }
执行结果
以上是关于《C程序设计语言》 练习1-21的主要内容,如果未能解决你的问题,请参考以下文章