• 《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;
    }
    

      

    执行结果

     

     
  • 相关阅读:
    Redis5设计与源码分析 (第17章 HyperLogLog相关命令的实现)
    Redis5设计与源码分析 (第16章 GEO相关命令)
    ES5和ES6函数的this指向
    vue响应式原理 (响应式并不等于数据双向绑定,千万不要混淆)
    vue中data为什么是函数而不是对象
    vue-enum 前端常量 枚举工具
    Vue3 写业务逻辑不适合用TS(TypeScript)
    vue-property-decorator vue3 ts 用的装饰器
    github git clone下载加速 && npm install 下载加速
    vue3 如果用ts,导出时候要用 defineComponent,这俩是配对的,为了类型的审查正确
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/12822876.html
Copyright © 2020-2023  润新知