1

これは、この K&R 演習からの私のバージョンの detab です。

タブストップのリストを引数として受け入れるように detab を変更します。引数がない場合は、デフォルトのタブ設定を使用します。

#include <stdio.h>
#include <stdlib.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;
}
int main(int argc, char *argv[])
{
     int valid;

     while((valid=Detab())!=0);

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

私の質問は、引数が複数ある場合 (たとえば 5、8、10)、次のタブ ストップがアクティブになるのはいつですか? プログラムは、開始 5 の代わりに TAB_STOP 8 を使用してどの時点で開始する必要がありますか? 改行の後、またはこれを行うにはどうすればよいですか?

また、これらすべてをメインに配置する必要があるのか​​ 、それとも別の機能に固執する必要があるのか​​ もよくわかりません。

編集:これは私が試したことです。

#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];
           }

           nums[x++] = val;
           val = 0;

     }

     Detab(nums);       


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

私は正しい軌道に乗っていますか?これは機能しますか?私はまだdetabを変更していません。

4

3 に答える 3

1

タブ位置のリストは、ストップ間の距離ではなく、特定の列を指定します。つまり、リストが 5,8,10 の場合、1 ~ 4 の位置にあるタブはカーソルを 5 に配置し、5 ~ 7 の位置ではカーソルを 8 に配置し、8 ~ 9 のタブはカーソルを 10 に配置します。引数リストの改行ごとに、最初のタブストップからやり直す必要があります。最後に定義されたタブ ストップの後の行での動作は、ユーザー次第です。通常は、既定のタブ ストップ間隔に戻ります。

于 2010-01-07T23:05:14.490 に答える
0

TABSTOP 5 8 10 は、5番目、8番目、および 10番目の列にタブ ストップがあることを意味すると解釈します (その後、8 列ごと、またはデフォルトとして使用しているものは何でも)。 10 桁目の次のタブ ストップは、18 桁目 (8 スペース後) または 16 桁目 (既定の 8 の次の倍数) である必要があります。

于 2010-01-07T23:04:38.763 に答える
0

設計しているので、ここにはある程度の余裕があります。ただし、最も一般的な方法は、最後に指定された幅の後にデフォルトの幅を使用することです。

たとえば、[5, 8, 10] が指定され、デフォルトが 8 の場合、[5, 8, 10, 18, 26, 34, ...] または [5, 8, 10, 16, 24、32、...]、好みに応じて。

これらの数値をではなくタブ位置として使用していることに注意してください。[5, 8] は、最初のストップが幅 5 の 5 であり、2 番目のストップが幅3の 8 であることを意味します。

于 2010-01-07T23:06:28.013 に答える