/ / memorizzazione degli input standard nella memoria dinamica in C - c, puntatori, informatica

memorizzare gli input standard nella memoria dinamica in C - c, puntatori, computer science

Attualmente sto facendo un po 'di programmazione usando il linguaggio C solo per sviluppare le mie abilità in C. Quello che sto facendo è memorizzare le parole in una memoria dinamica allocata ma avendo delle difficoltà con il puntatore ** ...

Per esempio,

while ((ch = getchar()) != EOF)

se scrivo abcd efgh, i caratteri "abcd" devono essere memorizzati ptr[0][i] e il secondo, "efgh" dovrebbe essere memorizzato in ptr[1][i] e questo dovrebbe essere fatto attraverso il loop.

Voglio farlo inizializzando,

char **ptr = (char**)malloc(sizeof(char*)*n);

È possibile??

Qualsiasi aiuto sarebbe molto grato!

risposte:

0 per risposta № 1

Ecco un esempio di memorizzazione di alcune stringhe in un array dinamico (char **).

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char    **strings = NULL;
size_t  nb_strings = 3;
size_t  strings_length = 10;

strings = malloc( sizeof(*strings) * nb_strings );
// Now you can store 3 pointers to char

for (size_t index = 0 ; index < nb_strings ; index++)
strings[index] = malloc( sizeof(**strings) * strings_length );
// Every pointer points now to a memory area of 10 bytes

for (size_t index = 0 ; index < nb_strings ; index++)
{
strings[index][0] = "";
strncat( strings[index], "string", strings_length - 1 );
// You can store some strings now
}

for (size_t index = 0 ; index < nb_strings ; index++)
printf("strings[%zu] = %s.n", index, strings[index]);
// You can check

for (size_t index = 0 ; index < nb_strings ; index++)
free(strings[index]);

free(strings);
// Do not forget to free

return (0);
}

0 per risposta № 2

Devi capire realloc (). Hai due livelli di elenco in corso, hai un elenco di parole che devono espandersi man mano che vengono inserite nuove parole e ogni parola è un elenco di caratteri.

Inizia con un elenco vuoto di parole

 char **words = 0;
int Nwords = 0;

E una parola vuota

 char *word = 0;
int wordlen = 0;

Come hai già fatto, il nostro ciclo principale è una lettura caratteriale dell'input

 while( (ch = getchar()) != EOF)
{
/* logic here */
}

Quindi qual è la logica?

 while( (ch = getchar()) != EOF)
{
if(!isspace(ch))
{
/* add letter to word */
}
else
{
if(wordlen > 0)
{
/* add word to word list */
}
}
}

Potrei compilare i commenti, ma lo farebbe per te. Si aumentano i buffer con realloc () per ogni nuova voce.