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 № 1Ecco 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.