【问题标题】:how to modify detab to accept list of arguments如何修改 detab 以接受参数列表
【发布时间】:2010-01-08 00:07:04
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define TAB_STOP 8
/* replaces tabs from input with the proper amount of blank spots */
int Detab()
{
     int c, x;
     int column;
     x = column = 0;

     while((c=getchar())!=EOF)
     {
        if(c == '\n') /* reseting counter if newline */
        {
            putchar(c);
            return 1;
        }
        else if(c!='\t')  /* column counts places to tab spot */
        { 
             putchar(c);
             column++; 

             if(column == TAB_STOP) 
             column = 0;
        }
        else /* tab */
        {
           for(x=0; x<TAB_STOP - column; x++)
           putchar('_');

           column = 0;
        } 
     }
     return 0;
}

#define MAX_ARGUMENTS 100
int main(int argc, char *argv[])
{
     int i, val = 0;
     int nums[MAX_ARGUMENTS];
     int x = 0;

     for(i = 1; i < argc; i++) {

           while(isdigit(*argv[i])) {
             val = val * 10 + *argv[i] - '0';
             *++argv[i];
           }

           if(x > MAX_ARGUMENTS - 1) 
              return 0;

           nums[x++] = val;
           nums[x] = '\0';
           val = 0;
     }

     while(Detab(nums));

     printf("Press any key to continue.\n");
     getchar();
     return 0;
}

在 main 中,我将所有参数(数字)放入 nums 数组中,然后将其传递给 detab。所以现在我对编辑 detab 的聪明方法很感兴趣,所以它可以工作。我仍在尝试找出一个有效的伪代码,但我真的不知道。

我认为它应该工作的方式是: 如果参数是 5、8、10,则前 4 个字符内的制表符导致位置 5,在 5 - 7th 字符中导致位置 8 等。 在换行的情况下,参数从头开始。

【问题讨论】:

  • 我在这里没有看到具体的问题。一般来说,这里的人不会做一般的“修复代码”事情。他们回答具体的技术问题。
  • 是参数解析的问题还是detab函数本身的问题?
  • 工具:澄清问题会很有帮助,例如“我如何编写 Detab 以便它接受参数列表?它的原型是什么?”您从上一个问题中继承了很多不适用和分散注意力的信息。
  • 是的......我正在寻找一个原型,或者至少某种伪代码能够正确编辑 detab。

标签: c pointers function entab-detab


【解决方案1】:

最常见的方法是让 Detab 接受一个指针(指向数组中的一个元素)和该数组的长度:

int Detab(int* data, int len); // access data[0] through data[len - 1]

这样称呼它:

void example() {
  int array[] = {5, 8, 10};
  Detab(array, 3);
  // or:
  Detab(array, sizeof array / sizeof *array); // second parameter evaluates to 3
                                              // without using a magic constant
}

这是一些扩展标签的伪代码:

def expandtabs_in_line(line, tabstops, default, space):
  result = ""
  for c in line:
    if c != "\t":
      result += c
    else:
      for stop in tabstops:
        if stop > len(result):
          result += space * (stop - len(result))
          break
      else:
        result += space * (default - (len(result) % default))
  return result

def expandtabs(lines, tabstops=[], default=8):
  for line in lines:
    yield expandtabs_in_line(line, tabstops, default, " ")

codepad 尝试一下。

【讨论】:

  • 你能把它翻译成C吗?我从来没有真正在 Python 中工作过,我无法真正翻译...该代码也使用 getline 函数,对吗?另外,len(result)是什么?
  • 您要求提供伪代码,并且“Python 是可执行伪代码”,所以我使用了它。 :) 这段代码接受一个行数组并对其进行迭代(for .. in ..),转换每一行(在单独的函数中)并返回它(yield 是一种特殊的返回类型)。 len() 是长度函数,len(result) 是结果的当前长度。
  • 另外,在链接代码中,我采用多行字符串文字并用换行符分割它(它给出一个字符串列表,每行一个),然后我调用 expandtabs,最后构造一个字符串由 expandtabs 结果的换行符 ("\n".join) 分隔。我强烈建议您在键盘上使用该代码,对其进行修改等;它应该是正确的,我认为我没有错过任何边缘情况。
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2012-07-22
相关资源
最近更新 更多