Problem mit C-String (pointer)



  • //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    #include<stdio.h>
    
    #include<string.h>
    
    char *revstring(char *satz)
    
    {
    
            char *anfang = satz;
    
            char *ende   = satz;
    
            int index = 0,index1 = 0;
    
            while((*ende) != '\0')
    
            {
    
                    index++;
    
                    ende++;
    
            }
    
            index1 = index;
    
            ende--;//setze ende auf letztes Element
    
            while(index >= 0)
    
            {
    
                 *satz = *ende; //weise letztes element dem ersten zu
    
                  ende--;
    
                  satz++;
    
                  index--;
    
            }
    
            return(satz -index1);
    
    }
    
    int main(int argc, char* argv[])
    
    {
    
            char *test;
    
            test = revstring("Test");
    
            printf("%s",*test);
    
            getchar();
    
            return 0;
    
    }
    
    //---------------------------------------------------------------------------
    


  • Hallo !

    Richard1 schrieb:

    ...
    Besonders die Ausgabe die angeblich funktionieren sollte
    printf("%s", *satz_rueckwärts);

    Welchen Compiler benutzst du ?
    Meckert der bei der Zeile: printf("%s", *satz_rueckwärts);
    nicht ?

    Zeichenketten werden so ausgegeben:
    printf("%s", satz_rueckwaerts);

    Also ohne das Sternchen( Dereferenzierungsoperator ).
    Und Umlaute sind eh verboten( EDIT ) 😃

    Es sein denn, du möchest nur ein Zeichen ausgeben, auf das der Zeiger
    satz_rueckwaerts gerade zeigt, dann würde das so aussehen:
    printf( "%c", *satz_rueckwaerts);

    Ansonsten scheinst du da etwas kompliziert zu denken, versuch es doch erstmal
    mit einer einfachen Ausgabe:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
    	//char *test = "lagerregal";
    	int i = 0;
    
    	char *satz_vorwaerts = "Ein Neger mit Gazelle zagt im Regen nie.";
    
    	// In einem Rutsch
    	printf("%s\n", satz_vorwaerts );
    
    	// Zeichenweise, Index - Schreibweise:
    	for ( i = 0; i < strlen(satz_vorwaerts); i++ )
    	{
    		printf( "%c", satz_vorwaerts[i] );
    	}
    
    	puts(""); // Zeilenumbruch
    
    	// Zeichenweise, Zeiger - Schreibweise
    	for ( i = 0; i < strlen(satz_vorwaerts); i++ )
    	{
    		printf( "%c", *( satz_vorwaerts + i ) );
    	}
    
    	puts(""); // Zeilenumbruch
    
        return 0;
    }
    


  • @ Richard1:

    Du hast es leider wieder versäumt eine Fehlerbeschreibung zu liefern. Aber ich glaube dein Problem ist, dass du schreibend auf ein Stringliteral zuzugreifen. Und das Sternchen bei deinem printf()-Aufruf ist auch falsch. Das solltest du nochmal im Buch nachlesen.



  • Danke für deine Antwort aber das Problem wie ich jetzt herausgefunden habe ist das mir der test string "sst" bei Test ausspuckt irgenetwas ma chew ich beim umdrehen falsch könntet ihr das vielleicht noch einmal anschauen?



  • Man sollte kein strlen in der For Schleife Bedingung nutzen, denn dann wird strlen n Mal ausgeführt und die Schleife läuft dann in mind. O(n²)



  • supertux schrieb:

    Man sollte kein strlen in der For Schleife Bedingung nutzen, denn dann wird strlen n Mal ausgeführt und die Schleife läuft dann in mind. O(n²)

    falls der string in der schleife nicht verändert wird, sollte ein guter compiler das erkennen und nur einmal 'strlen' aufrufen.
    aber, du hast natürlich recht, verlassen sollte man sich darauf nicht.
    🙂



  • supertux schrieb:

    Man sollte kein strlen in der For Schleife Bedingung nutzen, denn dann wird strlen n Mal ausgeführt und die Schleife läuft dann in mind. O(n²)

    👍

    Versuche ich mir mal zu merken !



  • pale dog schrieb:

    supertux schrieb:

    Man sollte kein strlen in der For Schleife Bedingung nutzen, denn dann wird strlen n Mal ausgeführt und die Schleife läuft dann in mind. O(n²)

    falls der string in der schleife nicht verändert wird, sollte ein guter compiler das erkennen und nur einmal 'strlen' aufrufen.

    😮

    Gerade erst hab' ich gelesen, daß du ein guter Bit-Schubser bist;
    mit Compilern kennst du dich aber überhaupt nicht aus.

    Woher soll denn der Compiler wissen, daß strlen nur
    die Länge eines Strings berechnet und zurückliefert und
    z.B. nicht mal schnell das Internet downloaded ( 🕶 ).

    Deine Aussage ist falsch, da kann nichts optimiert werden,;
    auch nicht vom allergutesten Compiler!



  • Javaner schrieb:

    Woher soll denn der Compiler wissen, daß strlen nur
    die Länge eines Strings berechnet und zurückliefert und
    z.B. nicht mal schnell das Internet downloaded ( 🕶 ).

    na, dieses 'strlen' ist doch eine bekannte standardfunktion.
    ich könnte mir vorstellen, dass ein schlauer compiler die nicht einmal aufruft, wenn sich der string nicht ändert, sondern gleich einen festen wert einsetzt.
    🙂



  • Da liegst du falsch!

    Der Compiler erzeugt einfach immer Code,
    der die Methode aufruft und die läuft auch immer
    den String bis zum Ende ('\0') durch um die Länge
    zu bestimmen.

    Ob das ne Standard-Methode ist oder nicht
    darf den Compiler überhaupt nicht jucken.



  • Javaner schrieb:

    Der Compiler erzeugt einfach immer Code,
    der die Methode aufruft und die läuft auch immer
    den String bis zum Ende ('\0') durch um die Länge
    zu bestimmen.

    warum sollte er?
    er kann doch auch code rausschmeissen. hauptsache das programm tut, was man von ihm erwartet.



  • Und woran sollte er erkennen, was sich hinter der Funktion verbirgt, die du da aufgerufen hast? (selbst wenn das Ding strlen() heißt, kann dir niemand garantieren, daß sich dahinter wirklich DIE strlen-Funktion aus dem ANSI-Standard verbirgt)



  • Der Compiler weissdoch
    nicht was die Funktion strlen
    macht. Du kannst dir ja schließlich
    eine eigene Methode strlen schreiben,
    die mal eben deine Festplatte formatiert
    und dann das Internet downloadet.

    Was hindert dich daran?
    Und woher soll der Compiler wissen,
    was deine Funktion strlen
    denn nun eigentlich macht?



  • CStoll schrieb:

    Und woran sollte er erkennen, was sich hinter der Funktion verbirgt, die du da aufgerufen hast?

    vielleicht, wenn ein '#include <string.h>' da ist, könnte er davon ausgehen, dass die standardfunktion gemeint ist.
    wer weiss schon, was ausgebuffte compilermacher für optimiertricks drauf haben...
    🙂



  • Klar ist das ein erster Anhaltspunkt, aber damit kann man sich recht schnell in die Nesseln setzen (und um solche Mikro-Optimierungen durchführen zu können, ohne das Programm unbrauchbar zu machen, brauchst du imho schon einen sehr intelligenten Compiler.



  • pale dog schrieb:

    könnte er davon ausgehen, dass die standardfunktion gemeint ist.

    Genau das darf der Compiler überhaupt nicht.

    Erst der Linker bindet, nachdem der Compiler fertig ist,
    strlen aus irgendeiner Bibliothek oder aus
    einem .o-File ein; da ist es vollkommen egal ob die
    Signatur von strlen nun aus string.h, sonstwo oder
    nirgendwo herkommt.

    Probier's doch einfach mal aus, deine eigene
    strlen-Funktion zu implementieren und dem
    Compiler unterzujubeln.



  • Javaner schrieb:

    pale dog schrieb:

    könnte er davon ausgehen, dass die standardfunktion gemeint ist.

    Genau das darf der Compiler überhaupt nicht.

    wieso nicht? ein compiler darf doch schlauer sein als der mensch. 🙂



  • Hast du meinen letzten Post nicht zu Ende gelesen? 😕

    Dann geb' ich's auf! 😞



  • Aber nicht schlauer als der ANSI-Standard vorschreibt. Beim Compilen ist überhaupt noch nicht bekannt, was für eine Funktion sich hinter diesem ominösen Namen "strlen()" später verbergen soll - das entscheidet erst der Linker. Und der Linker muß mit dem leben, was der Compiler zusammenoptimiert hat.

    Das bedeutet, wenn der Compiler jetzt sagt "ich kenne strlen() und auf den selben char* angewendet liefert das immer das selbe Ergebnis" und daraufhin die regelmäßigen Funktionsaufrufe rausoptimiert, und der Linker später nicht die Standardbibliothek dazulinkt, sondern eine selbstgeschriebene (deren Version von strlen() nebenbei noch mitloggen soll, wann und wo es aufgerufen wurde), ist das herauskommende Porgamm falsch.

    (davon abgesehen kann der Compiler - von einigen trivialen Fällen abgesehen - nicht einmal feststellen, ob sich der verwendete String zwischenzeitlich nicht doch verändert hat)



  • Genau! @CStoll.

    Dann darf ich jetzt endlich eine
    strlen-Funktion schreiben, die mir
    das Internet downloadet? 😮

    Dann mach ich mich gleich mal daran....


Anmelden zum Antworten