zoukankan      html  css  js  c++  java
  • C程序设计 习题之1-20 detab

    码农一定是最需要动手实操的行业之一。有一句话叫,好记性不如烂笔头,牵强附会引申到这里,变成看书百遍,不如码字运行一遍。是不是有那么一点味道?哈哈!

    这几天看的《C程序设计》,看完每个章节还是觉得没有完全落实,于是老老实实动手把习题做一遍,算是对不踏实内心的一个交待。仔细做下来才发现,习题其实并不是作者行文的简单回顾总结,而是在此基础上另有拔高和引申,如果你错过了,就少学很多东西。废话不多说,下面说一说1-20 detab这个小练习;

    题目是这样的:

    编写程序detab, 将输入中的制表符替换成适当数目的空格,使空格充满到
    下一个制表符终止位的地方。假设制表符终止位的位置是固定的,比如每隔B列就会出现一个
    制表符终止位。"应该作为变貴述是符号常量呢?

    看了两遍,按理解写出了下面的代码:

     1 #include <stdio.h>
     2 
     3 #define TABNUM 4
     4 
     5 int main()
     6 {
     7     char text[1000];
     8     char c;
     9     int index = 0;
    10 
    11     while ((c = getchar()) != EOF)
    12     {
    13         if (c == '	')
    14         {
    15             for  (int i = 0; i < TABNUM; ++i)
    16             {
    17                 text[index] = ' ';
    18                 ++index;
    19             }
    20         }
    21         else
    22         {
    23             text[index] = c;
    24             ++index;
    25         }
    26 
    27     }
    28 
    29     printf("%s
    ", text);
    30 
    31     return 0;
    32 }

    cc 编译正常,在运行验证时,发现直接用4个空格替换与输入并不吻合,输入时tab能根据实际输入对齐

    感觉中间补足的空格数应该有一定规律。于是,上网搜索果然发现tab处理有玄机。比如tab长度是8,从最开始算起,输入不足8个字符,此时按tab,系统会自动把光标跳到第9个字符,接下来的字符从此开始,如果此时再输入9个字符,则系统会将光标定位到第25个字符处,其中的规律可以总结成:

    pos = pos + 8 - (pos - 1) % 8

    也就是说当光标在pos位置时,输入tab,光标会跳转至pos + 8 - (pos - 1) % 8的位置。

    于是,改进后的代码如下:

     1 #include <stdio.h>
     2 
     3 #define TABNUM 8
     4 
     5 int main()
     6 {
     7     char text[1000];
     8     char c;
     9     int index = 0;
    10     int pos = 1;
    11     int space_number;
    12 
    13     while ((c = getchar()) != EOF)
    14     {
    15         if (c == '	')
    16         {
    17             space_number = TABNUM - (pos - 1) % TABNUM;
    18             while (space_number > 0)
    19             {
    20                 text[index] = ' ';
    21                 ++index;
    22                 ++pos;
    23                 --space_number;
    24             }
    25         }
    26         else if (c == '
    ')
    27         {
    28             text[index] = c;
    29             pos = 1;
    30             ++index;
    31         }
    32         else
    33         {
    34             text[index] = c;
    35             ++index;
    36             ++pos;
    37         }
    38 
    39     }
    40 
    41     printf("%s
    ", text);
    42 
    43     return 0;
    44 }

    运行验证:

    Perfect!符合预期。

    最后的总结就是,习题并不只是纯粹用来为书加量增厚的,还是很有实操的必要!重要的话就说这一遍啦。

  • 相关阅读:
    for循环里面不要进行remove操作,for循环里remove元素后,list的下标会减小,导致遍历不完全
    elasticsearch,java api, transport Client, 查询时索引库可以用通配符*和删除接口不能用
    (一)WebPack4.0 从零开始
    合并代码 dev 到 master
    vscode 终端无法输入问题 看这个就行了
    node 学习笔记:一、 nvm 安装管理Node版本
    常见的对象创建模式
    深入理解闭包
    sort对数组排序
    图片压缩
  • 原文地址:https://www.cnblogs.com/ihada/p/4805911.html
Copyright © 2011-2022 走看看