本书的练习1-20" C - 编程语言第2版"

时间:2014-05-10 16:00:27

标签: c replace tabs space

目前我正在读“C - The Programming Language”这本书,我对这个练习有疑问:

“编写一个程序'detab',它将输入中的选项卡替换为适当数量的空格到空格到下一个制表位。假设有一组固定的制表位,比如每个n-colmuns。应该是一个变量或一个符号参数?“

在我写这个程序的练习中放下一个问题:

#include <stdio.h>

#define COLUMNS 5   /* number of columns for a tab */

int main()
{
    char c;
int i;

while ((c = getchar()) != EOF) {
    if (c == '\t') {
        for (i = 0; i < COLUMNS; i++)
            putchar(' ');
    }
    else
        putchar(c);
}

return 0;
}

然后我在网上查了解决方案,发现了这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUFFER   1024
#define SPACE        ' '
#define TAB          '\t'

int CalculateNumberOfSpaces(int Offset, int TabSize)
{
   return TabSize - (Offset % TabSize);
}

/* K&R's getline() function from p29 */
int getline(char s[], int lim)
{
  int c, i;

  for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
    s[i] = c;
  if(c == '\n')
  {
    s[i] = c;
    ++i;
  }
  s[i] = '\0';

  return i;
}

int main(void)
{
  char  Buffer[MAX_BUFFER];
  int TabSize = 5; /* A good test value */

  int i, j, k, l;

  while(getline(Buffer, MAX_BUFFER) > 0)
  {
    for(i = 0, l = 0; Buffer[i] != '\0'; i++)
    {
      if(Buffer[i] == TAB)
      {
        j = CalculateNumberOfSpaces(l, TabSize);
        for(k = 0; k < j; k++)
        {
          putchar(SPACE);
          l++;
        }
      }
      else
      {
        putchar(Buffer[i]);
        l++;
      }
    }
  }

  return 0;
}

我现在的问题是我的代码和其他代码之间的区别是什么。 我认为练习会要求每个发生的都应该用n个空格代替。

现在我不知道其他代码是做什么的。

也许我理解练习错了。如果是这样,请向我解释。

感谢您的帮助。


好的,这个解决方案怎么样:

    #include <stdio.h>

#define TAB 8   /* size of a tab */

int main()
{
char c;
int i,column = 0;

while ((c = getchar()) != EOF) {
    if (c == '\t') {
        for (i = column; i < TAB; i++){
            putchar(' ');
        }
        column = -1;
    }
    else{
        putchar(c);
        }
    column++;
}

return 0;
}

新版本:

#include <stdio.h>

#define TAB 8   /* size of a tab */

int main()
{
char c;
int i,column = 0;

while ((c = getchar()) != EOF) {
    if(c == '\n')
        column = -1;

    if(column >= TAB)
        column = 0;

    if (c == '\t') {
        for (i = column; i < TAB; i++){
            putchar(' ');
        }
        column = -1;
    }
    else{
        putchar(c);
        }
    column++;
}
return 0;
}

2 个答案:

答案 0 :(得分:1)

你弄错了。您必须用空格替换每个选项卡,直到下一个制表符停止。这完全取决于光标的位置。

所以,如果每5列都有一个标签停止,你就可以这样想:

-----|-----|-----|-----|-----|-----|-----|-----|-----|

其中|是制表位,-是一个字符。点击标签会转到下一个标签页。因此,例如,如果您从上一个制表位的开头写入3个字符,然后点击制表符,则只需要写2个空格。

答案 1 :(得分:1)

您不希望用相同数量的空格替换每个标签:有些空格会替换为少于空格。

想象一下,我们希望TAB为10个空格

1234567890123456789012345678901234567890
one<TAB>  two<TAB>  fortytwo  four
   ^^^^^^^   ^^^^^^^        ^^
   7 space   7 space        2