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 № 1Hier 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 ().