Name verkehrt herum ausgeben



  • Hallo miteinander.

    Ich will in meinem Programm den eingegebenen Namen verkehrt herum wieder ausgeben.

    Also: thomas -> samoht, otto -> otto und so weiter.... 🙂

    Hier mein Code

    #include <stdio.h>
    
    char name[9];
    int i;
    
    int verkehren()
    {
    
        for (i = 0; i < 9; i++)
        {
            printf("%c", &name[i]);
    
        }
        for (i = 8; i >= 0; i--)
        {
            printf("%c", &name[i]);
    
        }
    }
    int main()
    {
    
        printf("Bitte geben Sie einen Namen ein (MAX. 9 Stellen)");
        scanf("%c", &name);
        verkehren();
    
        return 0;
    }
    

    Nun beim Ausführen des Programms kriege ich komische Zeichen zurück.
    Ich kann leider den Fehler nicht finden. Habt ihr eine Ahnung?

    Lg Ueli



  • Sorry noch was zum Text:
    Mein

    for (i = 0; i < 9; i++)
        {
            printf("%c", &name[i]);
    
        }
    

    Muss nicht beachtet werden, habe vergessen das rauszunehmen sorry.



  • Der erste Fehler ist schon mal, dass du bei scanf %s statt %c verwenden musst, wenn du einen ganzen String (nicht ein char, ein einzelnes Zeichen) einlesen willst.

    EDIT: Und in der Funktion verkehren musst du bei printf nicht die Adresse vom jeweiligen Zeichen übergeben, sondern das Zeichen selbst (also nicht &name[i], sondern name[i]).



  • Das ist C, kein C++.

    Ansonsten gibst du immer nur das erste Byte der Adresse vom Buchstaben aus. Und dann liest du anfangs auch nur einen Buchstaben ein... Benutz lieber streams, da kannst du weniger falsch machen.



    1. Das ist C was du da schreibst -> falsches Forum, hier gibts ein extra ANSI C-Forum
    2. "kriege ich komische Zeichen zurück." ist keine besonders genaue Beschreibung. wei welchen Eingaben kriegst du welche Zeichen?
    3. IIRC möchte scanf() einen Pointer auf char, wenn du %c einliest. name ist ein array aus char und wird bei Übergabe an eine Funktion bereits zu einem Poitner auf char, &name wird daher zu char**. Das willst du sicher nicht
    4. scanf() mit %c liest einen einzelnen Character ein, keinen C-String. Was du brauchst ist vermutlich %s
    5. du gibst das ganze Array Rückwärts aus, auch wenn der Name garnicht 8 Zeichen lang ist. Also gibst du alles was hinter dem '/0' Delimiter steht auch mit aus.

    zu Punkt 1 und 2 lies bitte den Thread "Du brauchst Hilfe?" (Siehe Link in meiner Signatur)
    zu Punkt 3-5 lies bitte ein wenig weiter in deinem Buch/Tutorial 🙂



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ok zuerst mal Danke für alle Antworten.
    Sorry, dass ich falsch gepostet habe.

    _matze hatte recht (und hat es sogar so formuliert, dass ich es verstanden habe^^)
    ich musste nur noch das &name[i] in name[i] ändern und %c in %s ändern.

    Gruess Ueli

    Ps: Werde nun noch versuchen, das mit den Leerzeichen in den Griff zu bekommen evtl. melde ich mich nochmals kurz.



  • Uelidetumm schrieb:

    Ps: Werde nun noch versuchen, das mit den Leerzeichen in den Griff zu bekommen evtl. melde ich mich nochmals kurz.

    Wenn du die Schleife so beibehalten willst, kannst du einfach bei name[i]==0 abbrechen.



  • mach doch z.b. so:

    #include <stdio.h>
    #include <string.h>
    
    void rev (char *in, char *out)
    {
      char *p = in + strlen(in);    // ende finden
      while (p >= in)               // solange wir nicht wieder am anfang sind
        *out++ = *--p;              // rueckwaerts kopieren, pointer weiterzaehlen
    }
    
    // test
    int main(void)
    {
      char *in = "thomas";
      char out[256];
      rev (in, out);   // drehen
      puts (in);       // original
      puts (out);      // gedreht
    }
    

    🙂



  • So danke _matze, du bist der Sieger^^

    danke auch an fricky, aber wollte mein Programm so beibehalten.
    der code sieht nun so aus:

    #include <stdio.h>
    
    char name[20];
    int i;
    
    int verkehren()
    {
    
        for (i=8; i >= 0; i--)
        {
            if (name[i]!=0)
            {
                printf("%c", name[i]);
            }
        }
    }
    int main()
    {
    
        printf("Bitte geben Sie einen Namen ein (MAX. 20 Stellen)");
        scanf("%s", &name);
        verkehren();
    
        return 0;
    }
    

    Lg Ueli



  • Uelidetumm schrieb:

    danke auch an fricky, aber wollte mein Programm so beibehalten.

    besser ist das. mein vorschlag ist nämlich ein wenig buggy.
    🙂



  • for (i=8; i >= 0; i--)
    

    Und wenn der Name 9 oder mehr Zeichen lang ist?



  • Unter anderem ist das:

    Uelidetumm schrieb:

    ...
        for (i=8; i >= 0; i--)
    ...
    

    Lg Ueli

    kagga!
    LG,
    kagga detect0r



  • hier kommts nich so auffe länge an

    void revers0r(char* t)
    {
    	char* s = t;
    	while(*t) t++;
    	while (--t >= s) putchar(*t);
    }
    
    int main() {
     	revers0r ("stoffregen");
    	return 0;
    }
    


  • knivil schrieb:

    for (i=8; i >= 0; i--)
    

    Und wenn der Name 9 oder mehr Zeichen lang ist?

    Kann doch gar nicht passieren! Schließlich hat er den Benutzer höflichst gebeten, nicht mehr Zeichen einzugeben! 😃



  • printf("Bitte geben Sie einen Namen ein (MAX. 20 Stellen)");
    


  • knivil schrieb:

    printf("Bitte geben Sie einen Namen ein (MAX. 20 Stellen)");
    

    Hm, der erste Code sah noch anders aus... War ja sowieso nur ein Witz. Er soll sich schließlich nicht auf das Wohlwollen des Benutzers verlassen.


Anmelden zum Antworten