这是我的 detab 版本,来自这个 K&R 练习:
修改 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——假设下一个制表位何时开始处于活动状态?程序应该在什么时候开始使用 TAB_STOP 8 而不是开始的 5?在换行之后或者我应该怎么做?
我也不确定是否应该将所有这些都放入 main 中,还是应该坚持使用单独的功能?
编辑:好的,这就是我尝试过的。
#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。