Estoy aprendiendo a programar en C siguiendo el libro K&R2. EL código que pongo a continuación es una posible solución al ejercicio 5-11 de la página 118.
Ahí va la pregunta:
¿Cómo puedo aumentar la dirección del puntero argv[0]? Si miran el código; lo he marcado en rojo, uso un bucle para aumentarla en uno cada vez ya que si escribo argv[0] + len el compilador me dice que la instrucción no hara nada.
Tal vez es una tontería pero no encuentro ningún ejemplo en el libro.
Código:
Gracias por adelantado! /* * Modify the programs entab and detab to accept a list of tab stops as * arguments. Use the default tab settings if there are no arguments. * * entab - replaces strings of blanks with the minimum number of tabs and * blanks to achieve the same spacing. * * detab - replaces tabs in the input with the proper number of blanks to * space to the next tab stop. * * Usage: endetab [-d] [-T number] */ #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXLINE 20 #define TABSTOP 5 #define DETAB '|' #define ENTAB '_' int gettabstop(char *s, int *len); int atoi(char s[]); void entab(char *s, int tabstop); void detab(char *s, int tabstop); int getline(char *line, int lim); int main(int argc, char *argv[]) { char line[MAXLINE]; int c, i, len; int tabstop = TABSTOP; int isdetab = 0; i = 0; while (--argc > 0 && (*++argv)[0] == '-') { i = 1; while ((c = *++argv[0])) { i++; switch (c) { case 'd': isdetab = 1; break; case 'T': if ((tabstop = gettabstop(argv[0], &len)) == 0) argc = 0; else { while (len-- > 0) /* move the index forward */ argv[0]++; } break; default: printf("endetab: illegal option %c\n", c); argc = 0; break; } } } if (argc != 0 || i == 1) printf("Usage: endetab [-d] [-T number]\n"); else { printf("Write a line\n"); while ((len = getline(line, MAXLINE)) > 0) { if (isdetab) detab(line, tabstop); else entab(line, tabstop); printf("\n"); } } return 0; } int getline(char * line, int lim) { int i, c; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) *line++ = c; *line = '\0'; return i; } int gettabstop(char *s, int *len) { char tabstop[MAXLINE]; int c, i; i = 0; while ((c = *++s) && isdigit(c)) { tabstop[i++] = c; } tabstop[i] = '\0'; *len = i; return atoi(tabstop); } void entab(char *s, int tabstop) { int c, i, j; i = 0; while ((c = *s++)) { if (c == ' ') { i++; if ((i % tabstop) == 0) putchar(ENTAB); } else { for (j = 0; j < (i % tabstop); ++j) putchar(' '); putchar(c); if (i != 0) i = 0; } } } void detab(char *s, int tabstop) { int c, i; i = 0; while ((c = *s++)) { i++; if (c == '\t') { putchar(DETAB); while ((i % tabstop) != 0) { putchar(DETAB); i++; } } else putchar(c); } } int atoi(char s[]) { int i, n, sign; for (i = 0; isspace(s[i]); i++) /* skip white space */ ; sign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') /* skip sign */ i++; for (n = 0; isdigit(s[i]); i++) n = 10 * n + (s[i] - '0'); return sign * n; }