frage zu printf mit format %c



  • der String in Zeile 2 soll vorwaerts und rueckwaerts auf der Konsole
    ausgegeben werden:

    1 #include <stdio.h>
    2 char *s = "Das ist ein Textstring "; int i;
    3 void main(void){for (i=printf("%s",s)-1;i+1;printf("%c",(char)s[i--]));}
    

    das ganze funktioniert u.a. deshalb, weil printf() nicht void wie in java

    sondern vom typ int ist und die anzahl der ausgegebenen Zeichen zurückgibt.

    die (-1) beim Startwert in der for-schleife brauche ich deshalb,
    weil das char-array mit null beginnt und der max-index dieses arrays um eins kleiner ist
    als der rückgabewert von printf(kompletter string, also alle Zeichen)

    im zaehlteil der forschleife wird nach ausgabe des letzten zeichens nochmal dekrementiert, d.h. bei Stringende ist i= -1 und somit true
    - deshalb im Bedingungsteil der forschleife "i+1"

    im zaehlteil der forschleife wird bei jeden durchlauf ein zeichen des char-arrays beginnend mit i(max) ausgegeben - so dass der string
    rückwäerts geschrieben wird.

    komischerweise funktioniert das nur mit diesen type-cast (char)
    ... lasse ich den weg, wird immer der ganze string statt einem einzelnen zeichen geprintet -

    trotz der formatierung %c in printf()...

    warum? 😕

    hat jemand ne idee?



  • Hmm, ich kann dir da eben auch nicht sehr weiterhelfen.

    Aber, welchen Compiler nutzt du?

    Und bis auf die erste Zeile hatte ich ein paar... fragwürdige Momente(globale Variablen etc.) 😉 Das mit der Schleife ist ein wenig trickreich. Hätte ich persönlich nie so gemacht(vermutlich hätte ich iwie die chars gespiegelt und dann ausgegeben).



  • Ich habe damit keine Probleme.



  • DaRe schrieb:

    ...

    Aber, welchen Compiler nutzt du?

    ...

    gcc --version
    gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2



  • Hast du das Problem auch mit?

    char s[]="Text";
    

    Hab ja gerade eben auch den Unterschied zwischen "char *String" und "char String[]" gelernt. Vllt. ist es nur mit cast möglich auf den read-only Bereich zuzugreifen.



  • s sollte ein char const * sein, und main muss int zurückgeben, aber beides sollte sich nicht so auswirken. Ich war auch der Meinung, dass gcc vor letzterem mal ungefragt gewarnt hätte; mittlerweile scheint das nur noch mit -Wall der Fall zu sein (es ist generell eine gute Angewohnheit, gcc mindestens -Wall -Wextra mitzugeben). Ob ein Zeiger oder ein Array verwendet wird, ist in diesem Fall herzlich gleichgültig, und das Lesen von Konstanten ist generell unkritisch.

    Ansonsten ist der ähnlichste Compiler, den ich gerade zur Hand habe

    $ gcc-4.5 --version
    gcc-4.5 (Debian 4.5.3-9) 4.5.3
    Copyright (C) 2010 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    Damit habe ich, wenn ich obrigen Code nehme und das "(char)" entferne, das selbe Verhalten wie mit dem Cast. Ich vermute, dass es sich um einen Tippfehler handelt. Bitte stell mal den Code hier rein, mit dem du den Fehler kriegst.



  • Oh oh ... bei mir ist der Fehler auch weg.
    Komischerweise funktioniert das jetzt auch ohne type-cast nach (char)

    Blöd, dass ich euch umsonst genervt hab.

    Aber dennoch danke für die tipps.

    main werde ich selbstverständlich void wegnehmen ... und zu int machen.

    dem ggc -wall mitzugeben - ist sicher nicht die schlechteste idee, danke

    ( ich hab vor 20Jahren mal C gelernt ... es kaum oder besser nie gebraucht -
    und befasse mich nun wieder damit, nachdem ich nen java-kurs besucht hab und
    meine damaliges vorurteil: interpretersprachen sind was für lehrer, sich
    neu bestätigt hat 😃 )



  • Neuling_Soonwald schrieb:

    interpretersprachen sind was für lehrer, sich
    neu bestätigt hat 😃 )

    Dann schau dir mal Perl an.

    So (unübersichtlich) wie du dein Programm geschrieben hast, wirst du deine Freude daran haben.



  • DirkB schrieb:

    Neuling_Soonwald schrieb:

    interpretersprachen sind was für lehrer, sich
    neu bestätigt hat 😃 )

    Dann schau dir mal Perl an.

    So (unübersichtlich) wie du dein Programm geschrieben hast, wirst du deine Freude daran haben.

    och ..in perl hab ich schon einiges gemacht ... sogar erfolgreich 😃



  • Neuling_Soonwald schrieb:

    dem ggc -wall mitzugeben - ist sicher nicht die schlechteste idee, danke

    Vorsicht, die Optionen sind case-sensitive. Das muss -Wall heißen (mit großen W). Persönlich benutze ich immer -Wall -Wextra -pedantic und manchmal auch -ansi dazu (wenn ich C99 nicht verwenden kann. Das ist bei Code der Fall, der plattformunabhängig sein muss, weil MSVC bis heute kein C99 beherrscht) und achte darauf, dass ich mit diesen Einstellungen keine Warnungen kriege.

    Ansonsten muss man auch in C nicht alles in einer Zeile machen, und es ist oft übersichtlicher, wenn man es sein lässt. Im konkreten Fall hätte ich das beispielsweise etwa so geschrieben:

    #include <stdio.h>
    
    int main(void) {
      char const *s = "Das ist ein Textstring ";
      int i;
    
      for(i = printf("%s", s) - 1; i >= 0; --i) {
        putchar(s[i]);
      }
    
      return 0;
    }
    


  • /* -Wall -Wextra -pedantic ( -ansi ) */

    werde ich mir jedenfalls merken .. Thx

    noch ne frage zu "const" ... ich meine, es ist schon klar, dass ne Variable deren Inhalt sich im Progr. nicht ändert eine Konstante sein kann ...

    Aber hat es ausser kosmetischen Gründen auch praktische Vorteile? 😕


  • Mod

    Neuling_Soonwald schrieb:

    /* -Wall -Wextra -pedantic ( -ansi ) */

    werde ich mir jedenfalls merken .. Thx

    noch ne frage zu "const" ... ich meine, es ist schon klar, dass ne Variable deren Inhalt sich im Progr. nicht ändert eine Konstante sein kann ...

    Aber hat es ausser kosmetischen Gründen auch praktische Vorteile? 😕

    Es hilft dir, Fehler zu vermeiden. Ist das nicht Vorteil genug?



  • Jedes mal, wenn eine Konstante einem Zeiger auf Variablen zugewiesen wird, tötet Algorithmos, der Gott der Programmierung, ein niedliches Kätzchen auf unnötig grausame Weise.



  • seldon schrieb:

    Jedes mal, wenn eine Konstante einem Zeiger auf Variablen zugewiesen wird, tötet Algorithmos, der Gott der Programmierung, ein niedliches Kätzchen auf unnötig grausame Weise.

    Du mimmst keine Drogen, oder?


Anmelden zum Antworten