toupper-Funktion mit Pointer



  • my oh my schrieb:

    DirkB schrieb:

    char* str_toupper(char* src, char* dest)
    

    ...
    Da steht das Ziel an erster Stelle.

    😕

    Das char* str_toupper(char* src, char* dest) stammt von src, nicht von mir!



  • Hallo Leute,
    nachdem ich es jetzt dank eurer Hilfe ein wenig mehr begriffen habe und einiges dazu programmiert habe, hänge ich wieder an der selben Stelle fest. Diesmal wird mein Wort groß ausgegeben aber auf wundersame Weise werden immer zwei Zeilen dazu gepackt und ab und zu mit irgendwelchen zufälligen Dingen beschrieben. Ich versteh einfach nicht warum. 😕
    Vielleicht kann jemand nochmal einen Blick drüber werfen, oder kennt den Fehler.

    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    
    #define MAX 100
    
    char * strtoupper (char * destination,  char * source) /*Funktion zur "Großstellen eines char */
    {
      int x =0;
     while (*source != '\0')
     {
       *destination++ = toupper(*source++);
    
     }
      return &destination[0];
    
    }
    char * strinv (char * destination, const char * source)
    
    {
     {
      destination += strlen(source);
      *destination=0;
      while (*source)
        *(--destination)=*source++;
    }
    return &destination[0];
    }
    
    main()
    
    {
    char destination[MAX], *source, str[MAX], str1[MAX], str2[MAX];
    
    printf( " Bitte string eingeben: ");
    fgets(str,MAX,stdin);
    source=str;
    
    strtoupper(str1,source);
    printf("%s\n",str1);
    source=str1;
    strinv(str2,source);
    printf("%s\n",str2);
    }
    

    Vielen Dank

    Gruß



  • Deine Funktion kopiert das '\0' nicht, zudem ist "return &destination[0]" sinnlos, da destination jetzt nur noch auf ein '\0' zeigt. Entweder ne void Funktion draus machen oder den Anfang zwischenspeichern.



  • Du musst bi strtoupper die '\0' am Ende vom String mit kopieren.
    Außerdem ist das &destination[0]; zu viel des Guten.
    Ein einfaches destination reicht da vollkommen.



  • Du hast beim Übertragen der Strings vergessen, den Null-Terminator im Zielstring zu setzen.

    PS: Das Gebastel mit dem source-Pointer in der main() ist unnötig und das Array destination nimmt nur Platz weg.



  • Bei strinv hat er doch durch

    destination += strlen(source);
    *destination=0;
    

    die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.



  • DirkB schrieb:

    Bei strinv hat er doch durch

    destination += strlen(source);
    *destination=0;
    

    die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.

    Aber dort wird als Quelle das Ergebnis des strtoupper()-Aufrufs verwendet - Garbage In, Garbage Out 😃



  • CStoll schrieb:

    Garbage In, Garbage Out 😃

    Ist schon klar. Aber immer noch besser als Garbage In -> Absturz.
    Obwohl das bei solchen Fehlern auch passieren kann.



  • Hallo,
    danke jetz hab ichs gesehen, ein wenig gegrübelt und wieder etwas mehr verstanden. Muss dazu sagen, dass ich hier einige Bücher rumfahren habe, da ist schon allein aus Zeitgründen einiges abgeschaut. Aber das

    while (*source != '\0')
    

    war auf meinem Mist gewachsen 😕

    DirkB schrieb:

    Bei strinv hat er doch durch

    destination += strlen(source);
    *destination=0;
    

    die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.

    Danke dafür und allen anderen auch!!!
    Schöne Woche!

    Gruß



  • zwerg1221 schrieb:

    Aber das

    while (*source != '\0')
    

    war auf meinem Mist gewachsen 😕

    Ist so auch völlig richtig.

    Nur wird, wenn *source gleich '\0' ist, die Schleife abgebrochen. Die '\0' wird nicht mehr kopiert.
    Da du aber weißt, das da eine '\0' steht, kannstdu sie per Hand reinkopieren.

    while (*source != '\0')
    {
      Schleife mit source++
    }
    *source = '\0';
    return destination;
    


  • Hallo DirkB,
    das funktioniert so aber leider auch nicht, er haut mir da wieder jede Menge Unfug rein. Aber irgendwie funktioniert das jetzt alles nichtmehr, er gibt mir nurnoch 3 Stellen an, den Rest vergisst er... 😡
    Oh Mann... und wär das nicht genug hab ich gerade erfahren, dass ich den string über ein Kommandozeilenargument

    main ( int argc, char * argv[] );
    

    einlesen soll. Und das will mal sowas von nicht funktionieren...
    boah!



  • void str_toupper(char *str)
    {
      while (*str)
        *str = toupper(*str), ++str;
    }
    
    void str_reverse(char *str)
    {
      char tmp;
      int len = strlen(str) - 1;
      for (int i = 0; i < len / 2; ++i)
      {
        tmp = str[i];
        str[i] = str[len - i];
        str[len - i] = tmp;
      }
    }
    
    int main(int argc, char *argv[])
    {
      if (argc < 2)
        return 0;
      printf("%s\n", argv[1]);
      str_toupper(argv[1]);
      str_reverse(argv[1]);
      printf("%s\n", argv[1]);
    }
    


  • Danke cooky451, genau so hab ich mir das auch gedacht aber es wollte nicht gehen. Immer wieder hab ich versucht ein argument in die Konsole zu bekommen; mit ./datei bala oder >deitei bla, was auch immer. Und vor 30 Sekunden WUSCH!; alles läuft; keine Ahnung warum, aber es läuft plötzlich!!! 🙂 Und wie ich davor geflucht hab... Was führ eine Achterbahnfahrt...
    Danke nochmal euch allen ihr seid echt spitze!

    Gruß


Anmelden zum Antworten