/ / Speichern von Standardeingaben im dynamischen Speicher in C - C, Zeigern, Informatik

Speichern von Standardeingaben im dynamischen Speicher in C - C, Zeigern, Informatik

Ich verwende gerade die Programmiersprache C, um meine C-Fähigkeiten zu entwickeln. Was ich mache ist, Wörter in einem zugewiesenen dynamischen Speicher zu speichern, aber mit ** Zeiger Schwierigkeiten zu haben ...

Beispielsweise,

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

wenn ich tippe abcd efgh, sollten die Zeichen "abcd" in gespeichert werden ptr[0][i] und die zweite, "efgh", sollte in gespeichert werden ptr[1][i] und dies sollte durch Schleifen erfolgen.

Ich möchte es durch Initialisieren tun,

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

Ist das möglich??

Jede Hilfe wäre sehr dankbar!

Antworten:

0 für die Antwort № 1

Hier ein Beispiel für das Speichern einiger Zeichenfolgen in einem dynamischen Array (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 für die Antwort № 2

Sie müssen realloc () verstehen. Sie haben zwei Ebenen der Liste, Sie haben eine Liste von Wörtern, die sich erweitern müssen, wenn neue Wörter eingegeben werden, und jedes Wort ist eine Liste von Zeichen.

Beginnen Sie mit einer leeren Liste von Wörtern

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

Und ein leeres Wort

 char *word = 0;
int wordlen = 0;

Die Hauptschleife ist, wie Sie es getan haben, ein charakteristisches Lesen der Eingabe

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

Was ist also die Logik?

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

Ich könnte die Kommentare ausfüllen, aber das würde es für Sie tun. Sie vergrößern die Puffer für jeden neuen Eintrag mit realloc ().