Simple (???) Zeigerproblematik, aber wo?



  • Hallo!
    Hätte da mal ne Zeigerproblematik und ne Frage dazu:

    Nehmen wir an:

    char s1[] = „BEISPIELTEXT“;
    char *s2;
    char c;
    int i;
    
    for (i = 0; i<= strlen(s1)-1;i++)
    {
       c = (char)tolower(s1[i]);
      strcat(s2,c);
    }
    
    printf(„%s“,s2);
    

    Dieses bewirkt so, oder so ähnlich, nicht das was ich will.
    Bei einer Variation kommt gar die Windows Fehlermeldung.

    „Read konnte auf dem Speicher soundso nicht fortgeführt werden“.

    Wo hab ich da n Fehler?
    Muss ich malloc bezüglich des Zeigers Verwenden, wenn ich ausgehend von seinem ersten Element, die kleinen Zeichen da hineinschreiben will, oder muss ich das erste Element kopieren und die folgenden konkatenieren?
    .
    Ich bin sehr stutzig im moment.
    Danke schon mal.



  • strcat(s2,c);

    in welchen speicher schreibt strcat hier denn?



  • char *s2 ist zwar ein Zeiger, aber er zeigt noch auf keine Speicherstelle?

    Also malloc?



  • me-S-on schrieb:

    char *s2 ist zwar ein Zeiger, aber er zeigt noch auf keine Speicherstelle?

    Also malloc?

    exakt.
    oder eben einen statischen bereich ala

    char s2[256];
    

    musst aber darauf achten, dass du genug speicher hast. weiters erwartet strcat einen string als 1. parameter. ergo musst du s2[0] noch auf 0 setzen, sonst sucht strcat ja nach dem string ende und findet es irgendwo, nur nicht dort wo es sein sollte.

    PS:
    strcat erwartet als 2. parameter auch einen string - du übergibst aber nur einen char. ergo nicht gut. eine normale zuweisung ala
    s2[i]=c;
    tut es auch.
    0 am ende nicht vergessen.



  • musst aber darauf achten, dass du genug speicher hast. weiters erwartet strcat einen string als 1. parameter. ergo musst du s2[0] noch auf 0 setzen, sonst sucht strcat ja nach dem string ende und findet es irgendwo, nur nicht dort wo es sein sollte.

    DU meinst wohl s2[ENDE], und nciht s2[0], ne?
    .
    .
    .
    Die normale zuweisung geht also auch, von wegen, s2[i]=c?
    dann ginge ja auch

    malloc(strlen(s1));
    s2[i]=(char)tolower(s1[i]);

    // und dann

    strcat(s2,"\0");

    //oder?



  • Erstmal erwartet strcat() auch, daß der Zielstring nullterminiert ist. Und dann solltest du lieber den Platz für die \0 auch mit bereitstellen:

    s2=mallo(strlen(s1)+1);
    for(i=0;i<strlen(s1);++i)
      s2[i] = tolower(s1[i]);
    s2[strlen(s1)]='\0';
    


  • Danke sehr.
    Wollte meine gesamte Anwendung , nachdem ich sie funktionsfähig gemacht habe, noch mal überall, wo es geht,mit malloc und free optimieren, und das hier ist n guter Einstieg.
    Habe bisher kaum bis gar nicht dynamische Speicherverwaltung miteinbezogen.

    In Zukunft benutze ich das von Anfang an ( auch wenn man das bei der heutigen RAM Grösse ausser Acht lassen kann, es zeugt immerhin von Ahnung und gutem Programmierstil).
    Bis demnächst!

    aalso bis heute.
    Klappt alles.
    Aber wie bekomme ich klug ne Dateiendung raus?
    verwende ich strstr(".exe") , dann bekomm ich leider auch die , die .exe.manifest heissen, oder .exe.lnk.
    Das ist demnach nich brauchbar, was ist mit ShGetShellExtension?


Anmelden zum Antworten