[C con Clase] duda con cadenas en C

Steven Richard Davidson stevenrichard.davidson en gmail.com
Mie Dic 19 17:27:01 CET 2007


Hola Leonel,

On Dec 19, 2007 4:10 PM, Leonel Florín Sellés
<leonel06033 en cfg.jovenclub.cu> wrote:
>
> hola amigos, estoy aprendiendo a programar en c/c++, y he comenzado
> por C, de hay mi duda.
>
> bueno, la cosa es que quiero hacer una entrada por consola desde el
> teclado a 10 cadenas de caracteres, o mejor dicho de 10 nombres,

Veamos. más o menos te has contestado a ti mismo. Lo que quieres es un
array de 10 arrays de tipo 'char'. Esto sería,

char listaNombres[10][256];

Según nos cuentas, quieres tener esta lista adaptada precisamente a
las longitudes de cada cadena. Tenemos unas cuantas opciones:

1. Crear un array de 10 punteros. Vamos creando cada array dinámico y
asignándolo a cada puntero. Sin embargo, vamos recreando cada array
dinámico si necesitamos más espacio. Por ejemplo,

char *pLista[10] = { 0 };
unsigned int n = 0;

for( ... )
{
  n = 0;
  do
  {
    n++;
    pLista[i] = (char *) realloc( pLista[i], n );
    pLista[i][n-1] = getchar();
  } while( !isspace(pLista[i][n-1]) );
  pLista[i][n-1] = 0;  // carácter nulo
}

Esto es algo costoso porque 'realloc()' está readjudicando memoria
continuamente. En realidad, a) crea otro bloque con el nuevo tamaño,
b) copia el contenido del bloque original al nuevo, c) destruye el
bloque antiguo, y d) retorna la dirección de memoria del bloque nuevo.

2. Copia las 10 cadenas a una sola cadena gigantesca. Luego, crea un
array de punteros. Ahora recorre la cadena truncándola con 'strtok()'.
Cada vez que recibas un p untero, guárdalo en el array de punteros.
Por ejemplo,

char szCadena[1024];
fgets( szCadena, 1024, stdin );

pLista[0] = strtok( szCadena, " \t\r\n" );

int i=0;
while( ++i < 10 && (pLista[i] = strtok( NULL, " \t\r\n" )) );

También podrías haber usado 'pLista[0]' para guardar la gran cadena,
previamente adjudicando memoria para ella, claro. Por ejemplo,

pLista[0] = (char *) malloc( 1024 );
fgets( szCadena, 1024, stdin );

strtok( szCadena, " \t\r\n" );

while( ... );


Con C, no tenemos TAD's estándares como en C++. Por lo tanto, nos toca
implementarlos nosotros mismos. Podrías crear tu propio TAD para una
cadena de caracteres dinámica y usarlo en este programa.


Espero haber aclarado la duda.

Steven




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