Аз правя някои кодиране в момента, използвайки 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 () за всеки нов запис.