domingo, 2 de mayo de 2010

Strings 2

Olvidé mencionar previamente un caso usual de error.

Se trata de suponer que por haber pedido memoria para un string, en un arreglo de char, ya es posible trabajar con las funciones relacionadas con strings (strlen, strcpy, etc).

Un código de ejemplo:
  char *s;
  s = (char*) malloc( 100 + 1 ); 
// mas tipico: (char*) malloc(strlen(otrostring)+1);

// intento fallido 1
  printf( "Valor inicial: %s\n" );  // muestra basura

// intento fallido 2
  strcat( s, "1234" );  // ademas del 1234 se ve basura

// etc


Las funciones relacionadas con strings trabajan suponiendo que tienes un arreglo unidimensional de caracteres que terminan en 0. Siempre suponen eso. Trabajan asi.

Cuando se pide memoria, con malloc, ya se tiene un arreglo unidimensional de caracteres, pero aun te falta la segunda parte (que terminen en 0) para usar las funciones relacionadas con strings.

El printf que se muestra arriba generalmente muestra basura, que no es mas que el contenido actual de la memoria que se pidio. Se esta pidiendo que muestre un string (%s), pero aun no se tiene uno.

Luego se hace strcat, nuevamente usando una función de strings, pero de nuevo se es "castigado" por no haber tenido un string para trabajar.

La solucion? Convierta su memoria pedida en un string:
  char *s;
  s = (char*) malloc( 100 + 1 ); // o (char*) malloc(strlen(otrostring)+1);
  s[0] = '\0';  // ahora si hay un string

  printf( "Valor inicial: %s\n" );

  strcat( s, "1234" );