Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lenguaje C: Recorrer caracteres en un array de punteros a char

Estas en el tema de Lenguaje C: Recorrer caracteres en un array de punteros a char en el foro de C/C++ en Foros del Web. Hola a tod@s!, 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 ...
  #1 (permalink)  
Antiguo 16/08/2010, 09:50
Avatar de josgalo  
Fecha de Ingreso: noviembre-2003
Ubicación: conmigo mismo
Mensajes: 31
Antigüedad: 21 años
Puntos: 0
Lenguaje C: Recorrer caracteres en un array de punteros a char

Hola a tod@s!,

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:
/* 
 * 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;
}
Gracias por adelantado!
__________________
"La vida es muy peligrosa. No por las personas que hacen el mal,
sino por las que se sientan a ver lo que pasa."

Albert Einstein

Etiquetas: caracteres, char, lenguaje, punteros, recorrer
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:30.