Char Array in Char Pointer kopieren ???
-
ehm ich muss eigentlich nur welche gleicher länge haben
also kann der user z.B. in der dateichar *array[] = {"dsd", "fdg"}; oder auch char *array[] = {"fdgsa", "skaie"};
verändern wollte ich die nur
von {"ars", "rsa"} zu {"dsa", "gfh"} die länge ist zwar am anfang variabel, nur verändert sie sich später nicht mehr.
die länge zu ermitteln brauch ich nicht die gibt der user selbst an
-
Nimm malloc und realloc.
-
ich hatte malloc schon probiert wenn ich aber später
char **array; array[5][4] = 'h'; oder printf("%s %c", array[3], array[3][4]);
probiert hatte ist das programm immer abgestürzt
natürlich habe ich in das array noch werte eingefügt
-
kytero schrieb:
char **array; array[5][4] = 'h';
Das kann so nicht funktionieren. Entweder du reservierst dynamischen Speicher für array mit malloc (dann ist array ein Zeiger) oder du definierst array als Array, dann ist array ein Array.
Bemühe dich mal, qualifizierte Fragen zu stellen und insbesondere die hier genannten Tipps für Neulinge zu beachten, bisher waren deine Fragen Rumgestochere im Nebel und schwer zu beantworten.
-
ich habe den speicher vorher mit malloc reserviert gehabt, nur hat es trotzdem nicht geklappt und wie soll ich es bitteschön als array definieren wenn ich nicht weis wie groß es ist, so etwas geht ja nicht
char *array[atoi(argv[1])];
oder muss ich wenn ich speicher reserviere irgendetwas beachten, ich hatte jetzt wenn es 5 strings mit jeweils 5 zeichen waren, 25 byte reserviert.
-
+5 byte
-
dürfte ich fragen wieso, wegen pointer oder muss am ende ein '\0' sein welches ich dann vergessen hätte.
-
Da du offensichtlich nicht Willens oder in der Lage bist, dein Problem qualifiziert zu schildern, damit du qualifizierte Antworten erhälst, die dir weiterhelfen, hier nochmal explizit ein Teil aus den Neulingshinweisen, die du nicht gelesen/beachtet hast:
Wenn du Code postest, dann bitte nur ein kleines darstellendes Programm, welches man sofort und ohne Umwege kompilieren kann. An dieser kleinen Demo soll dein Problem klar dargestellt sein. Die Demo darf keinen Code enthalten, der nicht am Problem beteiligt ist (abgesehen von allem, was zu einem kompilierbaren Programm gehoert).
kytero schrieb:
char **array; array[5][4] = 'h';
Ist eindeutig sinnfrei für eine hilfreiche Antwort, da du erst später damit herausrückst, dass du mit malloc gearbeitet hast.
-
ich hatte zwar schon in dem post erwähnt das ich malloc bereits ausprobiert habe,
aber es mag auch daran liegen das manche sachen nicht sofort klar waren,
da ich öfter im chats schreibe und nicht immer alles aufeinmal sage,
dass sehe ich ein und ich war so sparsam mit code da ich noch sehr weit am anfang stehe bei dem Projekt.
So sieht es bisher aus (das was hier jetzt wichtig ist):char **a; char *b[] = {"asd", "dsa", "asd"}; a = malloc(9); //oder müssen das 12 sein? a = b //klappt das theoretisch? oder muss ich strcpy nehmen habe ich beides //schon versucht auch jeden string einzeln zu kopieren printf("%s", a[1]); // das klappt jedenfalls nicht
-
Es müsste ungefähr so gehen (ungetestet):
char **a; char *b[] = {"asd", "dsa", "asd"}; a = malloc(3 * sizeof(char*)); a[0] = malloc(4); a[1] = malloc(4); a[2] = malloc(4); strcpy(a[0], b[0]); strcpy(a[1], b[1]); strcpy(a[2], b[2]); printf("%s", a[0]); printf("%s", a[1]); printf("%s", a[2]);
Schleifen kannst Du (hoffentlich) selbst bauen ...
-
ja das kann ich, mir war und ist es teilweise noch nicht ganz klar warum ich zwei mal malloc() benutzen muss und warum "malloc(4)", denn ich kann bei mir dafür einsetzen was ich will, es klappt trotzdem außer ich lasse es weg
.
ich bin einfach noch nicht so fit in Pointer und erst recht habe ich bisher wenig mit malloc gearbeitet,
jedenfalls nicht so wie hier^^
-
kytero schrieb:
ja das kann ich, mir war und ist es teilweise noch nicht ganz klar warum ich zwei mal malloc() benutzen muss und warum "malloc(4)"
char **zeiger;
ist erst mal ein Zeiger auf einen Zeiger, deshalb zweimal *.
mit dem ersten malloc wird Speicher für drei char - Zeiger besorgt, Du hast dann praktisch so etwas wie ein Array aus drei char-Zeigern.
Damit diese nun auf gültigen Speicher zeigen, wird für jeden dieser Zeiger noch mal Speicher besorgt, 4 Byte jeweils, weil Deine Strings aus drei chars zuzüglich abschließendem NullByte bestehen ...
-
ok dann habe ich das verstanden danke,
werd mich dann demnächst auch mehr bemühen alle fragen gleich von anfang an zu beantworten
-
Ich habe nach wie vor nicht verstanden, was du eigentlich erreichen willst, aber
char *b[] = {"asd", "dsa", "asd"}; char *a[] = {b[0], b[1], b[2]};
funktioniert natürlich ebenso und hat den Vorteil, ohne malloc auszukommen, d.h. auch ohne free.
-
sowas hätte ich auch wohl gerne gemacht ich wusste aber ja nur nicht wie viele strings in dem array sein werden und wie lang diese sind