Pointer strdup()
-
Hallo Leute,
bin in C eigentlich schon geübt, jedoch bewege ich mich nun bei Pointern auf Neuland. Ich will eigentlich nur einen String einlesen und diese mit Hilfe von Pointern und der Funktion strudup() duplizieren. Jedoch klappt dies nicht ganz.
Hier der kleine Sourcecode:#include <stdio.h> #include <string.h> char *duplicate(char *s); int main(int argc, char* argv[]) { char string [20]; char *ps = NULL; printf("Geben Sie eine Zeichenkette an: "); scanf("%s", &string); ps = *duplicate(&string); printf("%s", *ps); return 0; } char *duplicate(char *s) { char *dup = NULL; dup = *strdup(*s); printf("%s", *dup); return dup; }
-
ChrisL1988 schrieb:
char *duplicate(char *s) { char *dup = NULL; dup = *strdup(*s); printf("%s", *dup); return dup; }^^ 'dup' ist zwar ein pointer, wird aber auf den wert des ersten zeichens gesetzt und der input ist auch nur ein zeichen. das funzt so nicht (sollte sein: dup = strdup(s) statt dup = *strdup(*s)).
mach's doch einfach so:#define duplicate(s) strdup(s)ach ja, den neuen string musste mit 'free' wieder freigeben. ausserdem kann 'strdup' scheitern (wie malloc), also vorm benutzen auf 0 testen.

-
Hallo,
ja mir ist schon klar dass ich nur für das duplizieren keine eigene Funktion brauchen, da strdup das schon erledigt. Habe in meiner Funktion eigentlich noch Manipulationen vor, aber die wollte ich euch vorenthalten, da mein Problem ja schon hier aufgetreten ist.Leider klappt es mit deiner Lösung auch nicht wirklich. Das Problem ist, ich bekomme nicht ein falsches Ergebnis, sondern mein Programm stürzt ab. Wie du es beschreibst ist es also nicht möglich ganze String-Arrays Pointern zuzuweisen, da diese Pointer immer nur auf das erste Element des Pointers referenzieren?
-
ChrisL1988 schrieb:
Wie du es beschreibst ist es also nicht möglich ganze String-Arrays Pointern zuzuweisen, da diese Pointer immer nur auf das erste Element des Pointers referenzieren?
doch, geht. so sollte deine funktion klappen:
char *duplicate(char *s) { char *dup; dup = strdup(s); if (dup) printf("%s", dup); return dup; }und aufrufen dann etwa so:
char *old = "hallo"; char *new = duplicate (old); ... if (new) { // mach was mit dem neuen string ... free (new); // und wech damit. } ...
-
;fricky schrieb:
ChrisL1988 schrieb:
Wie du es beschreibst ist es also nicht möglich ganze String-Arrays Pointern zuzuweisen, da diese Pointer immer nur auf das erste Element des Pointers referenzieren?
doch, geht. so sollte deine funktion klappen:
char *duplicate(char *s) { char *dup; dup = strdup(s); if (dup) printf("%s", dup); return dup; }und aufrufen dann etwa so:
char *old = "hallo"; char *new = duplicate (old); ... if (new) { // mach was mit dem neuen string ... free (new); // und wech damit. } ...
Hey es klappt wirklich

Danke vielmals
Aber nun nur zu meinem Verständnis, mein Fehler war die Zuweisung dup = *strdup(*s)
Also das *s nur 's' sein sollte ist mir jetzt klar, da 's' ja schon ein Pointer ist. Aber warum wird die Funktion ohne den * aufgerufen, immerhin ist sie in den Bibliotheken immer so angegeben:char *strdup(const char *s);
-
^^das kommt von der mehrfachverwendung des sternchens. einerseits heisst es: 'das ist ein pointer' und zum anderen: 'jetzt greifen wir auf das zu, worauf der pointer zeigt'.

-
;fricky schrieb:
^^das kommt von der mehrfachverwendung des sternchens. einerseits heisst es: 'das ist ein pointer' und zum anderen: 'jetzt greifen wir auf das zu, worauf der pointer zeigt'.

Okay, aber einmal muss ich dich noch quälen

Du weist ja deinen String direkt dem Pointer zu.
char *old = "hallo"; char *new = duplicate (old);Ich hingegen will ihn vom Benutzer einlesen, leider klappt das noch immer nicht

char string [20]; char *ps = NULL; printf("Geben Sie eine Zeichenkette an: "); scanf("%s", &string); ps = duplicate(&string);
-
ChrisL1988 schrieb:
;fricky schrieb:
^^das kommt von der mehrfachverwendung des sternchens. einerseits heisst es: 'das ist ein pointer' und zum anderen: 'jetzt greifen wir auf das zu, worauf der pointer zeigt'.

Okay, aber einmal muss ich dich noch quälen

Du weist ja deinen String direkt dem Pointer zu.
char *old = "hallo"; char *new = duplicate (old);Ich hingegen will ihn vom Benutzer einlesen, leider klappt das noch immer nicht

char string [20]; char *ps = NULL; printf("Geben Sie eine Zeichenkette an: "); scanf("%s", &string); ps = duplicate(&string);So habe jetzt endlich das Programm hinbekommen. Nur eine Frage noch, ich habe bei der Funktion printf festgestellt, dass wenn ich mit %s einen String einbinde ich den Pointer ohne * verwenden muss. Will ich hingegen nur ein Zeichen ausgeben, verlangt er den pointer mit * und einem Index, beispielsweise *(string +2). Das zweitere erscheint mir ja logisch, da ich nur das eine Zeichen ausgebe, auf welches ich direkt deute. Das erste ist mir ein Rätsel, warum hier nur die Adresse übergeben wird ohne *.
Hier der endgültige Source zum anschauen:
#include <stdio.h> #include <string.h> #include <stdlib.h> char *duplicate(char *s); int main(int argc, char* argv[]) { char string [20]; char *reverse = NULL; printf("Geben Sie eine Zeichenkette an: "); scanf("%s", &string); reverse = duplicate(&string); printf("Ihr umgekehrter String: %s\n\n", reverse); // printf("Als einzelne Charakter Ausgabe %c", *(reverse + i)); return 0; } char *duplicate(char *s) { char *dup = NULL; int laenge = 0; int i = 0; dup = strdup(s); laenge = strlen(s); for(i=0; i<laenge; i++) { *(dup+i) = *(s+laenge-1-i); } return dup; }
-
vielleicht hilft das:
char *p; // eine pointer-variable wird angelegt p = "hallo"; // jetzt zeigt der pointer auf speicher, in dem 'h','a','l','l','o' und eine 0 stehen. char *q; // noch eine pointer variable wird erzeugt q = p; // der inhalt der ersten pointer-variablen wird nach q kopiert d.h. beide zeigen nun auf 'hallo' printf ("%d\n", p==q); // ergibt true, beide pointervariablen-inhalte sind identisch printf ("%d\n", *p==*q); // ergibt true. wenn beide pointer das gleiche beinhalten, zeigen sie auch auf das gleiche printf ("%d\n", &p==&q); // ergibt false, weil es ja zwei verschiedene variablen sind.oder kurz: wenn du an das kommen willst, worauf eine pointervariable zeigt, verwende *
willst du den wert der pointervariablen selbst haben, lass das * einfach weg.

-
;fricky schrieb:
vielleicht hilft das:
char *p; // eine pointer-variable wird angelegt p = "hallo"; // jetzt zeigt der pointer auf speicher, in dem 'h','a','l','l','o' und eine 0 stehen. char *q; // noch eine pointer variable wird erzeugt q = p; // der inhalt der ersten pointer-variablen wird nach q kopiert d.h. beide zeigen nun auf 'hallo' printf ("%d\n", p==q); // ergibt true, beide pointervariablen-inhalte sind identisch printf ("%d\n", *p==*q); // ergibt true. wenn beide pointer das gleiche beinhalten, zeigen sie auch auf das gleiche printf ("%d\n", &p==&q); // ergibt false, weil es ja zwei verschiedene variablen sind.oder kurz: wenn du an das kommen willst, worauf eine pointervariable zeigt, verwende *
willst du den wert der pointervariablen selbst haben, lass das * einfach weg.

Ich glaube ich habe es fast verstanden

Okay, wenn ich ohne * auf den pointer referenziere, dnan gibt er mir den Wert des Pointers, also die Adresse zurück. Okay soweit so gut, nur habe ich jetzt folgenden Code in meinem Programm.
printf("Ihr umgekehrter String: %s\n\n", reverse);Obwohl ich hier keinen Stern habe, gibt er mir den vollständigen String aus und nicht nur die Adresse. Ich habe ein Problem damit dass meiner Ansicht nach die Theorie nicht ganz mit meiner Praxis übereinstimmt

-
ChrisL1988 schrieb:
Obwohl ich hier keinen Stern habe, gibt er mir den vollständigen String aus und nicht nur die Adresse.
die 'dereferenzierung' (also das anwenden des sternchens) macht printf selber. du gibst printf einfach die adresse des strings (d.h. das, was in der pointervariablen ist), sagst ihm mit '%s', dass dort ein string steht und schwupps, gibt printf den string für dich aus.
Ich habe ein Problem damit dass meiner Ansicht nach die Theorie nicht ganz mit meiner Praxis übereinstimmt
denk noch mal etwas darüber nach, dann wirste sehen, dass es stimmig ist. wir sprechen ja hier nicht über sowas wie c++. *fg*

-
;fricky schrieb:
ChrisL1988 schrieb:
Obwohl ich hier keinen Stern habe, gibt er mir den vollständigen String aus und nicht nur die Adresse.
die 'dereferenzierung' (also das anwenden des sternchens) macht printf selber. du gibst printf einfach die adresse des strings (d.h. das, was in der pointervariablen ist), sagst ihm mit '%s', dass dort ein string steht und schwupps, gibt printf den string für dich aus.
Ich habe ein Problem damit dass meiner Ansicht nach die Theorie nicht ganz mit meiner Praxis übereinstimmt
denk noch mal etwas darüber nach, dann wirste sehen, dass es stimmig ist. wir sprechen ja hier nicht über sowas wie c++. *fg*

Ich werde mir die einschlägige Literatur noch einmal näher ansehen

Es ist irgendwie schon ein eigenes Thema mit den Pointern, lerne C seit Mitte September vom Studium aus (hatte aber ein wenig schon davor damit zu tun) und bis jetzt war mir jedes Beispiel sonnenklar, aber jetzt ist es irgendwie eine andere Denkweise