题目就不写了,大概意思就是:尽量用制表符'\t'替换掉字符串中的空格。

同学们需要注意的是,打印一个制表符'\t',其所占长度不是固定的。

这里要理解“制表符”和“制表符终止位”。“制表符”的作用是使得光标移动到下一个“制表符终止位”上。举个例子,假设制表符终止位是4、8、12、16......已经已经输入了10个字符,然后按一下Tab键,那么光标会移动到位置12上,同学们新建一个文本文档试一下就了解了。

这个题目看似简单,但是写一个简单、清晰的程序还是需要花一点脑筋的。

/*
这个程序看似简单,但是写一个简单、清晰的程序还是需要花一点脑筋的。
要去思考:什么情况下可以用一个'\t'代替空格?事实上只有两种情况,那就是:1、当一个“非空格字符”和该字符的下一个制表符终止位之间全部都是空格的时候,就可以用一个制表符'\t'替换这些空格例如:(用 _ 代表一个空格,用 | 表示制表符终止位,注意 | 并不是字符串的一部分)_ _ _ a b c _ _ | _ b c d f t q u r | _ d 能够用制表符替换的空格只有:(用 * 号 表示用制表符替换掉的空格)_ _ _ a b c * * | _ b c d f t q u r | _ d2、当两个制表符终止位之间全部都是空格的时候。这些空格就可以用'\t'替换。

  例如:  _ _ _ _ _ a b c | _ _ _ _ _ _ _ _ | a b c

  替换之后:  _ _ _ _ _ a b c | * * * * * * * * | a b c
*/#include<stdio.h>#define TABSTOP 8    //在Console中,制表符终止位一般是8,16,24,32......int main()
{int total = 0; //已经读到的字符数int spaces = 0; //已经读到的空格数char c;          //当前读到的字符while ((c = getchar()) != EOF){if (c != ' ')   //如果c不是一个空格
        {  if (spaces == 0) //如果已经读到 0 个空格
            {putchar(c);++total;}else   //c不是一个空格,但是读到的空格数 不等于 0
            {for (; spaces > 0; --spaces)//输出空格putchar(' ');spaces = 0;                 //读到的空格数重新置为 0 ++total;putchar(c);//输出当前读到的字符
            }if (c == '\n'){total = 0;spaces = 0;}}else //读了一个空格
        {++total;++spaces;int temp = (total-spaces) / TABSTOP;int nextLocation = (++temp) * TABSTOP;//下一个 制表符终止位if ( total< nextLocation);else//用'\t'填充空格
            {for (int i = 0; i < (nextLocation - (total-spaces)); i++)//为了明确输出的是'\t',用*号比较直观。putchar('*');//putchar('\t');spaces = 0;//读到的空格数重新置为 0
            }}}return 0;}

如果把一行先读到一个字符数组里面,程序还会简单一些:

 1 #include<stdio.h>
 2
 3 #define TABSTOP 8    //在Console中,制表符终止位一般是8,16,24,32......
 4 #define MAXSIZE 1024 // char数组的最大长度
 5
 6 int getline(char s[] , int size);
 7
 8 int main()
 9 {
10     char s [MAXSIZE];
11     while (getline(s, MAXSIZE) != 0)
12     {
13         printf("%s",s);
14         int i = 0;// 遍历s中的字符
15         char temp[MAXSIZE];
16         int count = 0;//记录temp中的字符的数量
17
18         for (; s[i] != '\0'; ++i)
19         {
20             if ((i + 1) % TABSTOP == 0 && s[i] == ' ')
21             {
22                 int pre = i - 1;
23                 while (pre > i - TABSTOP && s[pre] == ' ')
24                     --pre;
25                 ++pre;
26                 for (int j = i - TABSTOP + 1; j < pre; ++j)
27                     temp[count++] = s[j];
28                 //temp[count++] = '\t';
29                 for (int j = pre; j <= i; ++j)
30                     temp[count++] = '*';
31             }
32             if ((i + 1) % TABSTOP == 0 && s[i] != ' ')
33                 for (int k = i / TABSTOP*TABSTOP; k <= i; ++k)
34                     temp[count++] = s[k];
35         }
36         for (int k = i / TABSTOP*TABSTOP; k < i; ++k)
37             temp[count++] = s[k];
38         temp[count] = '\0';
39         printf("%s",temp);
40     }
41     return 0;
42
43 }
44
45 int getline(char s[], int size)
46 {
47     char c;
48     int i;
49     for (i = 0; i < size - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
50         s[i] = c;
51     if (c == '\n')
52     {
53         s[i] = c;
54         ++i;
55     }
56     s[i] = '\0';
57     return i;
58 }

转载于:https://www.cnblogs.com/wzm-xu/p/4200206.html

《C程序设计语言》读书笔记----习题1-21相关推荐

  1. C程序设计语言读书笔记:入门C语言

    一.总结基于<C程序设计语言>Brian W. Kernighan 徐宝文李志译 1.打印hello,word 2.C语言在UNIX操作系统中,源程序以.c作为文件的扩展名,用软件编译程序 ...

  2. c程序设计语言读书笔记,C程序设计语言读书笔记

    第一章 导言 第一章带领大家进入了C语言的世界,但是我感觉,如果没有一些基础,要想完全理解这一章的内容,还是有些困难的. 在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式.无论文本 ...

  3. 《python 程序设计》读书笔记

    <python 程序设计>读书笔记 笔者对于csdn博客的运用还是不太熟练,希望大家能够见谅.以后会不断提升写作的手法.这篇博客是我在学习python程序设计时候的笔记.我也是选择学习了大 ...

  4. 《POSIX多线程程序设计》读书笔记

    <POSIX多线程程序设计>读书笔记 一.      概述 1.    一个UNIX进程可以理解为一个线程加上地址空间.文件描述符和其他数据: 2.    多个线程可以共享一个地址空间,而 ...

  5. 《JavaScript高级程序设计》读书笔记 -12.1 window对象

    <JavaScript高级程序设计>读书笔记 -12.1 window对象 12.1 window对象 12.1.1 Global作用域 12.1.2 窗口关系[不是很懂] 12.1.3 ...

  6. 《JavaScript高级程序设计》读书笔记 【8章~】【持更】

    文章目录 上一篇:<JavaScript高级程序设计>读书笔记 [1~7章] 8. BOM 8.1. window对象 窗口位置 窗口大小 打开窗口 间歇调用与超时调用 系统对话框 8.2 ...

  7. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  8. java红牛农场答案_Java面向对象程序设计实验指导与习题解答(21世纪高等学校计算机专业实用规划教材)...

    导语 <Java面向对象程序设计实验指导与习题解答>是<Java面向对象程序设计>(作者耿祥义,清华大学出版社出版,2010)的配套实验指导和习题解答,目的是通过一系列实验练习 ...

  9. 《Go语言程序设计》读书笔记(二)函数

    <Go 语言程序设计>在线阅读地址:https://yar999.gitbooks.io/go... 函数 函数声明 函数声明包括函数名.形式参数列表.返回值列表(可省略)以及函数体. f ...

最新文章

  1. ios Carthage
  2. 拿到input输入的时间_【Keras 笔记】Input/Dense层的数学本质
  3. matlab对图像进行增强,利用matlab对图像进行增强处理.doc
  4. inline-block元素出现位置错位的解决方法
  5. Dojo 之 面向对象
  6. c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
  7. 荐书 | 10本书给你计算机大师思维
  8. 七宗罪----人性本恶
  9. 链克价格一路高涨,简单 5 招让你快速获取链克
  10. 一个简单的python例子(监控网页是否运行)
  11. 几种图片去水印方法的效果对比
  12. 无限滚动新一代老虎机
  13. HP JetDirect 170X 配置
  14. 快捷方式 ABP——切换MySQL数据库
  15. python+selenium+pycharm安装
  16. 联通宽带拨号开机自动连接
  17. elasticsearch ingest node
  18. 如何在latex中使用python及pythontex功能简介
  19. 转-Linux下装飞秋
  20. 我的 C 语言学习生涯记——纪念 Dennis M. Ritchie

热门文章

  1. 设备像素,设备独立像素,CSS像素
  2. 使用渲染纹理的制作摄像头
  3. Scrum项目1.0
  4. 利用TaskCompletionSource将EAP转换成TAP
  5. 13成都邀请赛 1005 Naive and Silly Muggles
  6. LockBits in GDI+【转】http://timothyqiu.com/archives/lockbits-in-gdiplus/
  7. C# 文件保存到数据库中或者从数据库中读取文件
  8. Windows下关闭占用指定端口应用程序的方法
  9. 推荐算法-聚类-均值偏移聚类(爬山算法)
  10. POJ2296二分2sat