Problem mit C-String (pointer)
-
rekursion oder for(i = strlen(s)-1; i >= 0; i--)
-
//--------------------------------------------------------------------------- #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)