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

时间:2022-04-28 20:04:23

题目就不写了,大概意思就是:尽量用制表符'\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 | _ d
 2、当两个制表符终止位之间全部都是空格的时候。这些空格就可以用'\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()
{
    ; //已经读到的字符数
    ; //已经读到的空格数
    char c;          //当前读到的字符
    while ((c = getchar()) != EOF)
    {
        if (c != ' ')   //如果c不是一个空格
        {
            ) //如果已经读到 0 个空格
            {
                putchar(c);
                ++total;
            }
            else   //c不是一个空格,但是读到的空格数 不等于 0
            {
                ; --spaces)//输出空格
                    putchar(' ');
                spaces = ;                 //读到的空格数重新置为 0
                ++total;
                putchar(c);//输出当前读到的字符
            }
            if (c == '\n')
            {
                total = ;
                spaces = ;
            }
        }
        else //读了一个空格
        {
            ++total;
            ++spaces;

            int temp = (total-spaces) / TABSTOP;
            int nextLocation = (++temp) * TABSTOP;//下一个 制表符终止位
            if ( total< nextLocation)
                ;
            else//用'\t'填充空格
            {
                ; i < (nextLocation - (total-spaces)); i++)//为了明确输出的是'\t',用*号比较直观。
                    putchar('*');
                //putchar('\t');
                spaces = ;//读到的空格数重新置为 0
            }
        }
    }
    ;

}

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

 #include<stdio.h>

 #define TABSTOP 8    //在Console中,制表符终止位一般是8,16,24,32......
 #define MAXSIZE 1024 // char数组的最大长度

 int getline(char s[] , int size);

 int main()
 {
     char s [MAXSIZE];
     )
     {
         printf("%s",s);
         ;// 遍历s中的字符
         char temp[MAXSIZE];
         ;//记录temp中的字符的数量

         for (; s[i] != '\0'; ++i)
         {
             ) % TABSTOP ==  && s[i] == ' ')
             {
                 ;
                 while (pre > i - TABSTOP && s[pre] == ' ')
                     --pre;
                 ++pre;
                 ; j < pre; ++j)
                     temp[count++] = s[j];
                 //temp[count++] = '\t';
                 for (int j = pre; j <= i; ++j)
                     temp[count++] = '*';
             }
             ) % TABSTOP ==  && s[i] != ' ')
                 for (int k = i / TABSTOP*TABSTOP; k <= i; ++k)
                     temp[count++] = s[k];
         }
         for (int k = i / TABSTOP*TABSTOP; k < i; ++k)
             temp[count++] = s[k];
         temp[count] = '\0';
         printf("%s",temp);
     }
     ;

 }

 int getline(char s[], int size)
 {
     char c;
     int i;
     ; i < size -  && (c = getchar()) != EOF && c != '\n'; ++i)
         s[i] = c;
     if (c == '\n')
     {
         s[i] = c;
         ++i;
     }
     s[i] = '\0';
     return i;
 }