W tej chwili zajmuję się kodowaniem, używając języka C, aby rozwinąć swoje umiejętności w języku C. To, co robię, to przechowywanie słów w przydzielonej pamięci dynamicznej, ale mam pewne trudności z ** wskaźnikiem ...
Na przykład,
while ((ch = getchar()) != EOF)
jeśli piszę abcd efgh
, znaki „abcd” powinny być przechowywane w ptr[0][i]
a drugi „efgh” powinien być przechowywany w ptr[1][i]
i należy tego dokonać poprzez zapętlenie.
Chcę to zrobić, inicjując,
char **ptr = (char**)malloc(sizeof(char*)*n);
czy to możliwe??
Każda pomoc byłaby bardzo wdzięczna!
Odpowiedzi:
0 dla odpowiedzi № 1Oto przykład przechowywania niektórych ciągów w tablicy dynamicznej (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 dla odpowiedzi nr 2
Musisz zrozumieć realloc (). Masz dwa poziomy listy, masz listę słów, które muszą się rozwijać wraz z wprowadzaniem nowych słów, a każde słowo jest listą znaków.
Zacznij od pustej listy słów
char **words = 0;
int Nwords = 0;
I puste słowo
char *word = 0;
int wordlen = 0;
Tak jak już to zrobiłeś, nasza główna pętla jest znakowym odczytem danych wejściowych
while( (ch = getchar()) != EOF)
{
/* logic here */
}
Więc jaka jest logika?
while( (ch = getchar()) != EOF)
{
if(!isspace(ch))
{
/* add letter to word */
}
else
{
if(wordlen > 0)
{
/* add word to word list */
}
}
}
Mógłbym wypełnić komentarze, ale to by było na tyle. Bufory powiększasz za pomocą realloc () dla każdego nowego wpisu.