问题描述

  编写程序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!='\n'; i++)
{
array[i] = c;
}
if (c=='\n')
{
array[i] = c;
i++;
}
array[i] = '\0';
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('\t');
}
if (array[i] == '\t')
{
nb = 0;
}else
{
for ( ; nb > 0; nb--)
{
putchar('*');
}
}
putchar(array[i]);
}
}
} return 0;
}

  

执行结果

 

《C程序设计语言》 练习1-21的更多相关文章

  1. 《C程序设计语言》 练习2-1

    问题描述 编写一个程序以确定分别由signed及unsigned限定的char.short.int及long类型变量的取值范围.采用打印标准头文件中的相应值以及直接计算两种方式实现 Write a p ...

  2. awk程序设计语言之-awk基础

    awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...

  3. 《C++程序设计语言(十周年纪念版)》【PDF】下载

    <C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...

  4. 《C++程序设计语言(英文第四版)》【PDF】下载

    <C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...

  5. c++学习书籍推荐《C++程序设计语言(特别版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...

  6. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  7. python程序设计语言笔记 第一部分 程序设计基础

    1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...

  8. 扩展《C程序设计语言》练习2-3程序通用性

    最近开始自学C语言,在看K&R的<C程序设计语言>.练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造. ...

  9. C语言入门(21)——使用DBG对C语言进行调试

    C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...

  10. 清风注解-Swift程序设计语言:Point11~15

    目录索引 清风注解-Swift程序设计语言 Point 11. 数值型字面量 代码事例: let decimalInteger = // 十进制的17 let binaryInteger = 0b10 ...

随机推荐

  1. 2017蓝桥杯日期问题(C++B组)

    标题:日期问题小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的, ...

  2. Struts2-学习笔记系列(11)-使用StrutsTypeConverter

    public class UserConvert extends StrutsTypeConverter { @Override public Object convertFromString(Map ...

  3. Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' could not find java.dll

    Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'Error: could not find java.d ...

  4. Progress笔记

    1. iconv -f gbk -t unicode test.tmp > test.csv 如果出现文件数据补全,需要确认在这之前,output是否已经close,如果output to指定了 ...

  5. O - Employment Planning HDU - 1158

    题目大意: 第一行一个n,表示共n个月份,然后第二行分别表示一个工人的聘请工资,月薪水,解雇工资.第三行是n个月每个月需要的工人的最少数目.然后求最少花费 题解: dp[i][j] 表示第i个月聘请j ...

  6. vue2.x学习笔记(六)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12571171.html. class与style绑定 操作元素的class列表和内联样式,是数据绑定的一个常见需求 ...

  7. PHP代码审计理解(三)---EMLOG某插件文件写入

    此漏洞存在于emlog下的某个插件---友言社会化评论1.3. 我们可以看到, uyan.php 文件在判断权限之前就可以接收uid参数.并且uid未被安全过滤即写入到了$uyan_code中. 我们 ...

  8. 基于 Python 的自动文本提取:抽象法和生成法的比较

    我们将现有的 提取方法(Extractive)(如LexRank,LSA,Luhn和Gensim现有的TextRank摘要模块)与含有51个文章摘要对的Opinosis数据集进行比较.我们还尝试使用T ...

  9. 数据源管理 | PostgreSQL环境整合,JSON类型应用

    本文源码:GitHub·点这里 || GitEE·点这里 一.PostgreSQL简介 1.和MySQL的比较 PostgreSQL是一个功能强大的且开源关系型数据库系统,在网上PostgreSQL和 ...

  10. js 一个或多个一维数组,算出元素之间相互组合的所有情况

    // 数据源 var target = { state1: ['1', '2'], state2: ['01', '02', '03'], state3: ['001','002'] } stackS ...