탭 정지의 수락 목록을 수락하기 위해 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;
}
내 질문은 예 5, 8, 10에 대해 하나의 주장이있는 경우 다음 탭 정지는 언제 활성화되기 시작한다고 가정합니까? 어느 시점에서 시작 5 대신 tab_stop 8을 사용하여 프로그램을 시작해야합니까? Newline 후 또는 어떻게해야합니까?
또한이 모든 것을 메인에 넣어야하는지 확실하지 않습니까? 아니면 별도의 기능을 고수해야합니까?
편집 : 알았어 이것이 제가 시도한 것입니다.
#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;
}
내가 올바른 길을 가고 있습니까? 이것이 효과가 있습니까? 나는 여전히 수정 된 수정을하지 않았다.
해결책
나는 Tabstop 5 8 10을 해석하여 5에 탭 정지가 있음을 의미합니다.th, 8th, 10th 열 (및 그 후 8 개의 열 또는 기본값으로 사용하는 모든 것을 사용하여 기본값으로 사용하는 것. 열 10 이후 다음 탭 중지가 열 18 열 (나중에 8 개의 공백) 또는 16 (다음의 배수 배수)에 있어야하는지 의문을 제기 할 수 있습니다. 기본 8).
다른 팁
탭 중지 목록은 정지 사이의 거리가 아닌 특정 열을 지정합니다. 즉, 목록이 5,8,10 인 경우 1-4 위치의 탭은 커서를 5에, 위치 5-7 위치에 커서를 8에 배치하고 8-9로 커서를 10에 배치해야합니다. 각 newline 인수 목록은 첫 번째 탭에서 다시 시작해야합니다. 마지막으로 정의 된 탭 정지 후 라인의 동작은 귀하에게 달려 있습니다. 일반적으로 일부 기본 탭 정지 간격으로 돌아갑니다.
당신은 그것을 설계 할 때 여기에 약간의 여유가 있습니다. 그러나 가장 인기있는 방법은 마지막으로 제공된 너비 후 기본 너비를 계속 유지하는 것입니다.
예를 들어, [5, 8, 10]이 제공되고 기본값이 8 인 경우 [5, 8, 10, 18, 26, 34, ...] 또는 [5, 8, 10, 16, 선호도에 따라 24, 32, ...].
이 숫자를 사용하고 있습니다 탭이 중지됩니다, 대신에 너비. [5, 8]는 첫 번째 정지가 폭 5로 5이고 두 번째 정지는 폭이 8입니다. 3.