タブストップのリストを受け入れるようにdetabを変更
-
19-09-2019 - |
質問
これは、この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;
}
もっとして1つの引数 - 例えば5、8、10-ときがある場合、私の質問は、次のタブがアクティブであることを開始すると仮定停止されていますか?その時点でTAB_STOP 8の代わりに、開始5を使用して番組開始すべきか?改行した後、またはどのように私はこれを行う必要がありますか?
私も、私がメインにこのすべてを置く必要がある場合は本当にわからない、または私は別の関数に固執する必要がありますか?
編集:OK、これは私が試したものです。
。#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変更haventは。
解決
私はタブが、5 目で停止8 目、および10 目のの列がある意味するTABSTOP 5 8 10を解釈したいです(そしてその後、8桁ごと、または任意のデフォルトとして使用している。それは、カラム10の後の次のタブストップは、カラム18(8つのスペース以降)または16デフォルトの(次の倍数であるべきかどうかを疑問視するオープンです8)。
他のヒント
タブストップのリストは、特定の列ではなく、ストップ間の距離を指定します。リスト5-7 8にカーソルを置くべき位置に1-4 5にカーソルを置くべき位置にタブは、次いで5,8,10であり、および10で8-9場所カーソル後あれば、あります各引数リストは、再び最初のタブストップからやり直す必要があります改行します。最後に定義されたタブストップの後にライン上の行動はあなた次第、通常、あなたには、いくつかのデフォルトのタブストップ間隔に戻って行くだろうされます。
あなたは、ここでは余裕を持っています。しかし、最も一般的な方法は、最後に提供された幅の後にデフォルトの幅を続行することです。
例えば、[5,8]、[10]場合には供給され、デフォルトは8であり、それは[5、8、10、18、26、34、...]または[5、8、10のように継続します、16、24、32、...]、好みに応じます。
私はのタブとしてこれらの番号を使用していることに注意してください代わりにの幅のの、の停止します。そう[5,8]第一の停止手段は、幅5と5であり、そして第二の幅と8であるの 3 の