引数のリストを受け入れるようにdetabを変更する方法
-
19-09-2019 - |
質問
#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;
}
メインで私はNUMS配列内のすべての引数(番号)を配置し、detabするためにそれを渡します。だから今それが動作するようdetab編集するスマートな方法がどうなるか興味イム。私はまだ働いて擬似コードのために把握しようとしているが、私は本当に知らない。
私はそれが動作するはず取り払わ方法は次のとおりです。 引数が5、8、10であるならば、最初の4つの文字内部タブが5で、位置5に至る - 7チャー等POS 8につながり 改行の場合、引数は初めからもう一度起動します。
解決
最も一般的な方法は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するでそれを試してみてください。
所属していません StackOverflow