/ / съхраняване на стандартни входове в динамичната памет в C-c, указатели, компютърни науки

съхраняване на стандартни входове в динамична памет в C - c, указатели, компютърна наука

Аз правя някои кодиране в момента, използвайки C език, само за да развивам уменията си в C. Това, което правя е да се съхраняват думи в разпределена динамична памет, но има някои трудности с ** указател ...

Например,

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

ако пиша abcd efgh, символите, "abcd" трябва да се съхраняват в ptr[0][i] и второто, "efgh" трябва да се съхранява в ptr[1][i] и това трябва да се направи чрез циклиране.

Искам да го направя чрез инициализиране,

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

това възможно ли е??

Всяка помощ ще бъде много благодарен!

Отговори:

0 за отговор № 1

Ето пример за съхраняване на някои низове в динамичен масив (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 за отговор № 2

Трябва да разберете realloc (). Имаш две нива на списък, имаш списък с думи, които трябва да се разширяват, тъй като се въвеждат нови думи, а всяка дума е списък от символи.

Започнете с празен списък с думи

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

И празна дума

 char *word = 0;
int wordlen = 0;

Както сте направили, нашата основна верига е символно прочетена на входа

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

И така, каква е логиката?

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

Бих могъл да попълня коментарите, но това би било за вас. Вие увеличавате буферите с realloc () за всеки нов запис.