[C con Clase] arreglo de apuntadores

Steven Richard Davidson stevenrichard.davidson en gmail.com
Mie Nov 14 20:59:52 CET 2007


Hola rnapoles,

On 11/14/07, rnapoles en ipihlg.rimed.cu <rnapoles en ipihlg.rimed.cu> wrote:
> Salu2 lista llevo un pequeño tiempo aprendiendo a programar en C con unos
> libros que me he conseguido el programa que muestro a continuación
> no da ningún error de sintaxis  el problema es en tiempo de ejecución.
> supongo que sea que no deja modificar el arreglo de punteros
> en ese caso que podría hacer para que la función upcase lograra
> modificar dicho arreglo
>
> gracias de antemano.
>
> #include <stdio.h>
> void upcase(char *s);
>
> int main(int argc, char *argv[])
> {
> char a[]="lolo";
> char *b[3]={"hola1","hola2","hola3"};

Aquí estás creando un array de punteros. Sin embargo, estás apuntando
a cadenas literales. Como se trata de valores literales, no puedes
modificarlos y por eso te marca error.

La solución es crear arrays. Esto sería,

char b[3][] = { "hola1", "hola2", "hola3" };

Ahora, 'b' contendrá los arrays, en lugar de apuntar a ellos.

> upcase(a);             //aqui todo ok
> upcase(b[2]);      //El problema es aqui
> printf("%s\n",a);
> printf("%s\n",b);

No sugiero hacer esto, ya que 'b' es un array de cadenas. Deberías
elegir una cadena en particular. Por ejemplo,

printf( "%s\n", b[0] );
printf( "%s\n", b[1] );
printf( "%s\n", b[2] );

> system("PAUSE");
>   return 0;
> }
>
> void upcase(char *s)
> {
> while (*s!='\0')
> {
> if (*s>='a' && *s<='z')
> *s-=32;
> *s++;
> }
>      }

Podrías usar la función estándar 'toupper()', declarada en <ctype.h>.
Esto sería,

void upcase( char *s )
{
  while( *s )  toupper( *s++ );
}


Espero que esto aclare la duda.

Steven




Más información sobre la lista de distribución Cconclase