String verkehrt ausgeben



  • Hallo,
    ich würde gerne einen String in C++ verkehrt ausgeben.
    Ich arbeite mit Devc++ bzw Visual Studio und benutze printf etc. (statt cout)

    Programm:

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>

    void umg(char str1[],char str2[]);
    int main()
    {

    char str1[11]={"Hallo Nemo"};
    char str2[11];

    umg(str1,str2);

    printf("Der kervehrte Satz lautet: %s", str2);// mit %c gibt man nur einzelne Zeichen aus und mit %s die ganze Zeichenkette

    getch();

    }

    void umg(char str1[], char str2[])
    {
    int i,y;

    for(i=0,y=11;i<11,y>0;i++,y--)
    {
    str2[i]=str1[y];
    }

    }

    Findet ihr denn Fehler? 😮

    Danke im Vorraus



  • Du hast vergessen das NUL ans ende zu setzen.



  • du meinst die Binäre null oder?



  • tkausl schrieb:

    Du hast vergessen das NUL ans ende zu setzen.

    ich weiss nicht was du genau damit meinst?
    Wenn man einen String einliest mit scanf() muss man die binäre NULL setzen mit gets zb nicht aber hierbei haben wir ja eine fest definierte länge also die Strings sind ja nicht verschieden lang?

    Vielen Dank für deine schnell antwort



  • Oh, ich seh grade auch, dass deine schleife verkehrt ist. Du musst von 10 bis 0 gehen, nicht von 11 bis 1. Und dann noch das NUL(0) ans Ende.



  • #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>

    void umg(char str1[],char str2[]);

    int main()
    {

    char str1[11]={"Hallo Nemo"};
    char str2[11];

    umg(str1,str2);

    printf("Der kervehrte Satz lautet: %s", str2);// mit %c gibt man nur einzelne Zeichen aus und mit %s die ganze Zeichenkette

    getch();

    }

    void umg(char str1[], char str2[])
    {
    int i,y;

    for(i=0,y=10;i<11,y=0;i++,y--)
    {
    str2[i]=str1[y];
    }
    str2[i]='\0';

    }

    so??



  • #include "stdio.h"
    void printrev (char *txt)
    {
    	if (*txt)
    		printrev (txt+1);
    	putchar (*txt);
    }
    

    aufrufen:

    printrev ("hello world");
    


  • Z schrieb:

    #include "stdio.h"
    void printrev (char *txt)
    {
    	if (*txt)
    		printrev (txt+1);
    	putchar (*txt);
    }
    

    aufrufen:

    printrev ("hello world");
    

    Danke!!



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • nemanja_nemo schrieb:

    Wenn man einen String einliest mit scanf() muss man die binäre NULL setzen

    Nein, muss man nicht. Das macht scanf selber.

    nemanja_nemo schrieb:

    ... aber hierbei haben wir ja eine fest definierte länge also die Strings sind ja nicht verschieden lang?

    Egal.
    In C enden Strings mit '\0' (oder 0, ist dasselbe)

    Das Problem bei dir ist, dass du die '\0' von str1[10] nach str2[0] kopiert hast.
    Somit hat printf sofort die '\0' gesehen und nichts ausgegeben.



  • nemanja_nemo schrieb:

    [...] die Binäre null [...]

    Ich kann garnicht soviel fressen wie ich bei sowas gern kotzen würd. 🙄

    nemanja_nemo schrieb:

    ich würde gerne einen String in C++ verkehrt ausgeben.

    ftfy:

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    void umg(char * str)
    {
    	std::reverse(str, str + std::strlen(str));
    }
    
    int main()
    {
    	char str[] = { "Hallo Nemo" };
    	umg( str );
    	std::printf( "Der kervehrte Satz lautet: \"%s\"\n\n", str );
    }
    


  • Also der ist mal richtig gut - hat mich ne Weile gedauert:

    char* heute_mal_von_hinten(char* str)
    {
    	std::size_t len = std::strlen(str);
    	char *str_new = new char[len+1];
    	str_new[0] = '\0';
    	char *p = str + len;
    	for(; len; std::strncat(str_new, --p, 1), --len );
    	return str_new;
    }
    
    int main(int argc, char* argv[])
    {
    	char str[] = { "Hallo Nemo" };
    	char *str_new = heute_mal_von_hinten( str );
    	std::printf( "Der kervehrte Satz lautet: \"%s\"\n\n", str_new );
    	delete str_new;
    	return( 0 );
    }
    

    EDIT:
    Nachdem es C ist hätte ich eigentlich malloc verwenden müssen. Hab ich jetzt aber kein Bock mehr drauf.



  • EOP schrieb:

    char *str_new = new char[len+1];
    
    // ...
    
    	delete str_new;
    

    ouch!

    EOP schrieb:

    Also der ist mal richtig gut [...]

    Händisch? echt jetzt?

    void heute_mal_von_hinten(char * s)
    {
    	char t, *p = s;
    	while( *p++ );
    	if( --p-s )
    		while( p --> s )
    			t = *p, *p = *s, *s++ = t;
    }
    

    ich mag den Pfeiloperator ( --> ) 😉



  • Swordfish schrieb:

    EOP schrieb:

    char *str_new = new char[len+1];
    
    // ...
    
    	delete str_new;
    

    ouch!

    Jaja, hab ich nach dem posten auch bemerkt du kleinlicher Mensch du. 🙂

    Swordfish schrieb:

    ich mag den Pfeiloperator ( --> ) 😉

    Pfeile und Pfeiloperatoren sind was für Winnetou aber nix für "real programmers". :p (und das kompiliert?)

    Swordfish schrieb:

    Händisch? echt jetzt?

    Na klar - ich werde ja schließlich dafür bezahlt hier für etwas Spaß zu sorgen. Sonst hätte ich mir so einen Quatsch auch nie ausgedacht. 🙂
    Eigentlich wollte ich ja memmove benutzen, war mir dann aber doch zu kompliziert.

    Und komm mir jetzt bloß nicht mit so Sachen wie const.
    Ihr und euer const. Bei mir gibt's kein const, weil bei mir ist alles voll dynamisch. Ha!



  • EOP schrieb:

    Swordfish schrieb:

    ich mag den Pfeiloperator ( --> ) 😉

    Pfeile und Pfeiloperatoren sind was für Winnetou aber nix für "real programmers". :p (und das kompiliert?)

    Klar kompiliert das. Aber es is erschreckend wie wenig Erwähnung der wahre Pfeiloperator in der Literatur findet. Es gibt wohl kaum was sprechenderes als " p fliegt gegen s "!?



  • Swordfish schrieb:

    nemanja_nemo schrieb:

    [...] die Binäre null [...]

    Ich kann garnicht soviel fressen wie ich bei sowas gern kotzen würd. 🙄

    Mir wird eher von der unglaublichen Arroganz speiübel, die hier so mancher Möchtegern-Supercoder, Neulingen gegenüber entgegenbringt.



  • Was hat die Tatsache daß 0 in jedem Stellenwertsystem 0 ist mit Programmieren und/oder Neulingen darin zu tun?



  • Swordfish schrieb:

    Was hat die Tatsache daß 0 in jedem Stellenwertsystem 0 ist mit Programmieren und/oder Neulingen darin zu tun?

    Die Frage ist eher, wieso du dich, wegen solcher Banalitäten, einem Neuling gegenüber wie das letzte Arschloch benimmst.



  • Die Zahl 0 war geschichtlich gesehen ein Meilenstein und somit nicht immer vorhanden - kann also auch nicht in jedem Stellenwertsystem 0 gewesen sein. 🤡

    Ganz davon abgesehen finde ich den Ausdruck binäre Null gar nicht schlimm, denn es zeigt die klare Differenzierung zum Zeichen '0'.
    Die Aussagen ist letztendlich auch vollkommen korrekt und legitim, denn das Terminierungszeichen ist binär dargestellt eben 0. Während '0' (ASCII) binär 110000 wäre.

    Im übrigen waren alle deine Beiträge in diesem Thread nicht konstruktiv. Du hast Dinge kritisiert, aber keine konkrete Lösung genannt. Der Hammer ist aber, dass du C++ Code (C++ Header, reverse, ....) bei einer Fragestellung zu C postest - und es auch noch mischt (printf, strlen, ...).

    Und das(!) ist nun wirklich peinlich, denn C und C++ sollte man schon unterscheiden können. Ausreden wie "im Forum vertan" zählen hier ebenfalls nicht, denn dann wäre alles in C++ gehalten.

    Lern erst mal selbst die Basics. 😃

    Setzen. Sechs.



  • Okay, da hatte jemand explizit nach C++ gefragt. Trotzdem ist das kein C++, sondern C/C++.

    Eine Fünf- auch im Hinblick deiner Sozialkompetenz bleibts somit. 🤡


Log in to reply