comment modifier detab d'accepter la liste des arguments
-
19-09-2019 - |
Question
#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;
}
Dans principale i mettre tous les arguments (chiffres) à l'intérieur tableau nums et passer ensuite à detab. Alors maintenant im intéressé quelle serait la façon intelligente de modifier detab de sorte qu'il fonctionne. Je suis encore à essayer de comprendre pour un travail pseudocode mais je ne sais pas vraiment.
La façon dont je tought il devrait fonctionner est: si les arguments sont 5, 8, 10 puis une patte intérieure 4 premiers caractères conduit à la position 5, en 5 - 7 carbonisation conduit à pos 8 etc. Dans le cas d'un saut de ligne, les arguments tout recommencer depuis le début.
La solution
La façon la plus courante est d'avoir detab accepte un pointeur (qui pointe vers un élément dans un tableau) et la longueur de ce tableau:
int Detab(int* data, int len); // access data[0] through data[len - 1]
Appel comme ceci:
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
}
Voici quelques pseudo-code pour l'expansion des onglets:
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, " ")
Essayez- CodePad .