Dynamische Speicherreservierung bei Strings
-
Hey Leute, hab da ein Problem und zwar:
Was muss man tun, um dynamischen Speicher für einen String anzufordern?
Also das müsste dann so gehen, das ich mir einen char *ptr anlege und ein char array[] oder? Dann müsste man hingehen und ptr = malloc(40*sizeof(char)) machen ne?Und dann hingehen und das aus ptr über strcpy in das array speichern oder?-GhostfaceChilla-
-
für was in ein Array speichern?
du kannst auch auf pointer per index mit [] zugreifen.
verschiebst du den pointer ist ptr[0] natürlich nicht mehr das erste char.
-
orioon schrieb:
für was in ein Array speichern?
du kannst auch auf pointer per index mit [] zugreifen.
verschiebst du den pointer ist ptr[0] natürlich nicht mehr das erste char.Was meinst du genau damit?
Könntest du mir ein Beispiel zeigen und erklären?-GhostfaceChilla-
-
Du brauchst ein *char ptr . char array[] ist etwas anderes.
Dem array kannst du nichts zuweisen.
-
Ok, aber wenn ich jetzt zb "das" eingebe, wird ja in einer variable char nur 'd' gespeichert, wohin mit dem "as" ?
-GhostfaceChilla-
-
Schon mal ausprobiert?
Es war ja soweit richtig was du gesagt hast, nur das du dafür einen Pointer und kein Array brauchst.
Verwechsele nicht char und char*
Und bei "das" hast du 4 Zeichen: 'd','a','s','\0'char *pc; char hallo[] = "Hallo Welt!" ... pc = (char *)malloc(strlen(hallo)+1); if (pc != NULL) strcpy(pc,hallo); // hallo = (char *)malloc(strlen(pc)+1); // Das geht nicht!
-
Also dann z.B so.:
/* Woerterliste.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *pc; char array[20]; pc = malloc(strlen(array)+1); fgets(array, 20, stdin); strcpy(pc, array); .... .... return EXIT_SUCCESS; }
Doch ausgeben kann ich das Wort ja dann nicht oder?
Also mit printf?Weil ich möchte halt Wörter eingeben, die dann abgespeichert werden und das man die eingegebenen Wörter auf Wunsch sich anzeigen lassen kann.-GhostfaceChilla-
-
Du solltest schon Zeile 12 und 13 vertauschen.
Denn array ist nicht initialisiert, da steht irgendetwas drin.
strlen(array) kann etwas von 0 bis .... ergeben.Erst wenn du was eingelesen hast, kannst du die Länge des Textes ermitteln.
GhostfaceChilla schrieb:
Doch ausgeben kann ich das Wort ja dann nicht oder?
Also mit printf?Warum nicht? Wenn du es kopieren kannst, kannst du es auch ausgeben.
-
Und wie gibt man das dann aus??
Weil aus *pc würde ich ja nur einen Wert 'h' bekommen.(Also z.B bei "hallo")-GhostfaceChilla-
-
Standard Ausgabefunktionen unter C sind doch die printf Dinger, oder ?
Um dein pc (char * = zeiger auf zeichenkette in C) auf die Standartausgabe(Console) auszugeben:printf("%s",pc);
printf iss ne ganze Familie, also man kann damit (fprintf) auch in dateien, pipes, sockets, Datenstroeme allegemein, schreiben etc ... also alles was ne Art Filedescriptor zur verfuegung stellt ... Je nach system auch.
generell unformatiert koenntest auch per read und write auf alles drauf, was nen filedesciptor hat, nur die Formatierung muesstest selber kontrollieren dann.
DIe meisten Standards (Posix, Winapi) bieten dir nen Filedescriptor fuer die Standard I/O an (stdin, stdout,stderr) und entsprechende lese und schreibfunktionen.also ein :
write(stdout,pc,strlen(pc));
haette selben effekt wie obenCiao ...
-
Ohne *, da du ja einen Zeiger auf den Anfang der Zeichenkette hast.
array (ohne die []) ist das gleiche (aaaber wie schon gesagt...).printf("Der Text: %s\n", pc); // oder puts(pc);
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *pc; char array[20]; char hallo[] = "hallo"; pc = malloc(strlen(20)); strcpy(pc, "Hallo"); strcpy(array, "Welt!"); printf("%10s : sizeof: %d | Laenge : %d | %s\n", "array", sizeof(array), strlen(array), array); printf("%10s : sizeof: %d | Laenge : %d | %s\n", "hallo", sizeof(hallo), strlen(hallo), hallo); printf("%10s : sizeof: %d | Laenge : %d | %s\n", "pc", sizeof(pc), strlen(pc), pc); printf("%10s : sizeof: %d | Laenge : %d | %c\n", "*array", sizeof(*array), 1, *array); printf("%10s : sizeof: %d | Laenge : %d | %c\n", "*hallo", sizeof(*hallo), 1, *hallo); printf("%10s : sizeof: %d | Laenge : %d | %c\n", "*pc", sizeof(*pc), 1, *pc); .... .... return EXIT_SUCCESS; }
-
Vielen dank ich habs
Sehr nett von dir das du mir so geholfen hast
Danke-GhostfaceChilla-
-
Nochmal ne Frage
Und wzar was ist wnen ich jetzt das alles in for schleife packe, diese durchläuft 5 durchläufe, dann wird ja unter print nur das letzte Wort ausgegeben, das eingegeben wurde. Um alle auszugeben, müsste man diese dann extern in eine datei speichern und diese dann am ende wieder einlesen?Oder geht das auch anders?-GhostfaceChilla-
-
Du kannst das natürlich auch in der for- Schleife ausgeben.
oder:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *pc[5] = {NULL}; // pc ist jetzt ein Array von Pointern auf char char array[20]; int i; // anlegen for(i=0;i<5;i++) { printf("Wort %d eingeben:", i); fgets(array, 20, stdin); pc[i] = (char *)malloc(strlen(array)+1); if (pc[i] != NULL) strcpy(pc[i], array); } // .... // ausgeben for(i=0;i<5;i++) { printf("Wort %d = %sn", pc[i]); } // .... // bereinigen !wichtig! for(i=0;i<5;i++) { free(pc[i]); } return EXIT_SUCCESS; }
-
/* Woerterliste.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *pc; char array[20]; int i; for(i=0; i < 5; i++){ fgets(array, 20, stdin); pc = malloc(strlen(array)+1); strcpy(pc, array);} for(i=0; i<5; i++){ printf("%s", pc[i]); } return EXIT_SUCCESS; }
So gehts ned wo liegten der Fehler?
-GhostfaceChilla-
-
Erst einmal solltest du deinen Code richtig einrücken. So ist das doch unübersichtlich!
Was du offenbar willst ist nicht das was du tust.
char *pc
ist für einen String! In der ersten for-Schleife überschreibst du immer den Zeiger auf den vorherigen String! pc[i] ist demnach ein einzelnes Zeichen und kein String und daher ist der Format-String "%s" falsch (davor sollte dich aber ohnehin dein Compiler warnen, wenn du alle Warnungen einschaltest).Außerdem solltest du prüfen ob malloc nicht fehlgeschlagen ist (Rückgabewert NULL).
edit: Schau dir einfach an was DirkB gemacht hat!
-
Ok,habs jetz, danke
Habs kapiert danke-GhostfaceChilla-
-
Aber des bringts ja voll ned da jetzt dynamisch speicher anzufordern, da muss das array ja trotzdem nene bestimtmen Wert zugewiesen bekommen, sprich *pc[20] oder *pc[500] in meinem Fall müsste man ja dann praktisch ein *pc[800] oder höher erstellen, also geht es gar nicht ein array während der Laufzeit mehr Speicher zuzuweisen oder?
-GhostfaceChilla-
-
Das *pc[800] ist ein Array mit 800 Zeigern auf char (Also 800 mal char *array)
Du kannst da 800 Wörter verwalten, die (fast) beliebig lang sein können.Vorher war statisch Array aus Array aus char
char woerter[800][20]; // Platz für 800 Wörter, die 19 Zeichen lang sein dürfen.
jetzt dynamisch Array aus Zeigern auf char
char *woerter[800] // Zeiger für 800 Wörter, die (fast) beliebig lang sein dürfen.
Mit einem Zeiger auf ein Array mit Zeigern auf char kannst du auch in der Anzahl der Wörter flexibel sein:
int anz_woerter 800; // oder 20 oder 1500 oder ... char **woerter; woerter = (char **)malloc(anz_woerter * sizeof(*woerter)); // (fast) beliebig lange Liste mit Zeigern auf (fast) beliebig lange Wörter
Wenn du noch flexibeler sein willst, nimmst du verkettete Listen.