/ / przechowywanie standardowych danych wejściowych do pamięci dynamicznej w C - c, wskaźniki, informatyka

przechowywanie standardowych danych wejściowych do pamięci dynamicznej w C - c, wskaźniki, informatyka

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

Oto 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.