%s



  • Kann mir wer sagen wofür %s steht?

    printf("Sendet: %s\n",buf);



  • 1. Falsches Forum. Das gehört in Ansi C Forum
    2. %s bedeutet, dass das argument in const char* sein soll. (bei dir ist das buf)

    Simon



  • Das ist ein Platzhalter. Und, falsches Forum.



  • Alles falsch. "%s" innerhalb einer Zeichenkette führt dazu, dass zuerst das Zeichen '%' gefolgt von dem Buchstaben 's' in der Zeichenkette auftauchen.

    -scnr- 😉



  • Dieser Thread wurde von Moderator/in dEUs aus dem Forum C# und .NET 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.



  • Sorry LordJaxon,

    LordJaxom schrieb:

    Alles falsch. "%s" innerhalb einer Zeichenkette führt dazu, dass zuerst das Zeichen '%' gefolgt von dem Buchstaben 's' in der Zeichenkette auftauchen.

    -scnr- 😉

    aber das stimmt hier nicht. Der String, in dem das '%s' steht, ist ein
    Formatstring. Hier wird das %s, wie z.B. auch %d, %u ..., als Platzhalter
    interpretiert.

    David_pb und simon.gysi haben Recht.

    Man-Page von printf:

    int printf(const char *format, ...);
    
       Format des Formatstrings
           Der  Formatstring  ist  eine  Zeichenkette, die, so vorhanden, in ihrem
           initialen Shift-Zustand beginnt und endet.  Der Formatstring setzt sich
           zusammen  aus  Null  oder  mehr Anweisungen: normale Zeichen (nicht %),
           welche  unverändert  zum  Ausgabekanal  kopiert  werden;  und   
           Umwandlungsspezifikationen,  welche jeweils null oder mehr Argumente
           fordern.
           Jede Umwandlungsspezifikation wird durch das Zeichen % eingeleitet  und
           endet  mit einem Umwandlungsspezifikator.  Dazwischen können (in dieser
           Ordnung) null oder mehr Flags, eine optionale minimale Feldbreite, eine
           optionale Genauigkeit und ein optionaler Längenmodifikator.
    

    Du hast im folgenden Fall Recht:

    #define FORMAT "%s\n"
        printf( FORMAT, "%s");
    

    was das gleiche ist wie:

    printf("%s\n", "%s");
    

    Im obigen Beispiel ist der erste String der Formatstring, bei dem das
    "%s" durch den zweiten String ersetzt wird.

    Gruß mcr



  • mcr schrieb:

    Du hast im folgenden Fall Recht:

    #define FORMAT "%s\n"
        printf( FORMAT, "%s");
    

    was das gleiche ist wie:

    printf("%s\n", "%s");
    

    Im obigen Beispiel ist der erste String der Formatstring, bei dem das
    "%s" durch den zweiten String ersetzt wird.

    Gruß mcr

    falsch. es müsste schon

    Du hast im folgenden Fall Recht:

    #define FORMAT "%s\n"
        printf( FORMAT, "%%s");
    

    was das gleiche ist wie:

    printf("%s\n", "%%s");
    

    heißen, wenn du den gewünschten effekt haben willst :p



  • Machine schrieb:

    falsch. es müsste schon

    Du hast im folgenden Fall Recht:

    #define FORMAT "%s\n"
        printf( FORMAT, "%%s");
    

    was das gleiche ist wie:

    printf("%s\n", "%%s");
    

    heißen, wenn du den gewünschten effekt haben willst :p

    Sorry, dass ich dich enttäuschen muss. Aber du hast Unrecht:

    #include <stdio.h>
    
    #define FORMAT "%s\n"
    
    int main(void) {
        printf( FORMAT, "%s" );
        printf( FORMAT, "%%s" );
        return 0;
    }
    

    liefert:

    %s
    %%s
    

    Wie du siehst: ich habe Recht.

    Gruß mcr



  • mcr schrieb:

    aber das stimmt hier nicht. Der String, in dem das '%s' steht, ist ein
    Formatstring.

    Falls die Ironie nicht rübergekommen sein sollte:
    In C# gibt es keine Formatstrings mit % als Platzhalter.



  • Machine schrieb:

    falsch. es müsste schon

    Du hast im folgenden Fall Recht:

    #define FORMAT "%s\n"
        printf( FORMAT, "%%s");
    

    was das gleiche ist wie:

    printf("%s\n", "%%s");
    

    heißen, wenn du den gewünschten effekt haben willst :p

    Du bist im Unrecht. Das Steuerzeichen % ist nur im Formatsring der printf/scanf Familie von Bedeutung. Alle andere Zeichen außerhalb des Formatstrings werden 1:1 ausgegeben.



  • Hmm, wieso ergießt ihr Euch derart erschöpfend über Format-Strings? Welche Strings was bedeuten und wie das alles funktioniert kann man bis ins Detail im Netz nachlesen. Weniger als 10s Aufwand bei der Google-Suche.



  • Tachyon schrieb:

    Hmm, wieso ergießt ihr Euch derart erschöpfend über Format-Strings? Welche Strings was bedeuten und wie das alles funktioniert kann man bis ins Detail im Netz nachlesen. Weniger als 10s Aufwand bei der Google-Suche.

    hier ging es schon lange nicht mehr um format strings. hier ging es schlichtweg einfach darum, _wer_ recht hat 😃



  • ui, sorry.. ich hab da grad das % mit dem & verwechselt 😃



  • Machine schrieb:

    ui, sorry.. ich hab da grad das % mit dem & verwechselt 😃

    % mit & verwehselt? Wo denn? da find ich keinen Zusammenhang 😕



  • supertux schrieb:

    Machine schrieb:

    ui, sorry.. ich hab da grad das % mit dem & verwechselt 😃

    % mit & verwehselt? Wo denn? da find ich keinen Zusammenhang 😕

    wenn du in einem string ein & zeichen haben willst, dann musst du zwei & schreiben.

    Bsp:

    CString foo = _T("Video && Fotoshow");
    SetDlgItemText(IDC_ST_FOO, foo);
    

    Da steht dann auf dem Control Video & Fotoshow.



  • Machine schrieb:

    supertux schrieb:

    Machine schrieb:

    ui, sorry.. ich hab da grad das % mit dem & verwechselt 😃

    % mit & verwehselt? Wo denn? da find ich keinen Zusammenhang 😕

    wenn du in einem string ein & zeichen haben willst, dann musst du zwei & schreiben.

    Bsp:

    CString foo = _T("Video && Fotoshow");
    SetDlgItemText(IDC_ST_FOO, foo);
    

    Da steht dann auf dem Control Video & Fotoshow.

    Ja? Also bei mir steht da konkret "Video && Fotoshow".
    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define IDC_ST_FOO 0
    #define _T(x) x
    
    typedef char* CString;
    typedef unsigned int hokus_pokus_t;
    
    void SetDlgItemText(hokus_pokus_t drolf, CString rolf)
    {
        (drolf % 2)?printf("%s\n", rolf):printf("%s\n", rolf);
    }
    
    int main()
    {
        CString foo = _T("Video && Fotoshow");
        SetDlgItemText(IDC_ST_FOO, foo);
        return 0;
    }
    

    🤡 🤡 😃



  • Machine schrieb:

    CString foo = _T("Video && Fotoshow");
    SetDlgItemText(IDC_ST_FOO, foo);
    

    Da steht dann auf dem Control Video & Fotoshow.

    ??? und was hat das mit C zu tun? Siehe Tachyons ironische Antwort.

    edit: bei GUI Frameworks ist es üblich, dass das Ampersand doppelt vorkommt, wenn man das Zeichen ausgeben will, weil man mit "&Menu" in Menüs/Knöfpe/Formulare/usw das & dazu benutzen kann, um den Buchstaben 'M' zu untertsreichen, damit es so aussieht:

    Menu

    Das hat aber mit C nichts zu tun (wie ich oben geschrieben hab) sondern das ist eine Eigenheit von GUI Frameworks (eher von dieses _T Makros).



  • supertux schrieb:

    ??? und was hat das mit C zu tun?

    SetDlgItemText ist durchaus eine C-funktion
    machste noch:

    #define char* CString
    #define _T
    

    ... und dann sollte es compilen.
    🙂



  • fricky schrieb:

    supertux schrieb:

    ??? und was hat das mit C zu tun?

    SetDlgItemText ist durchaus eine C-funktion
    machste noch:

    #define char* CString
    #define _T
    

    ... und dann sollte es compilen.
    🙂

    es hat insofern mit C nichts zu tun, weil wenn du das &-Zeichen in einer Zeichenkette ausgeben willst, muss das &-Zeichen nicht doppelt vorkommen. Dass GUI Frameworks etwas anders machen, damit Textbuchstaben unterstrichen erscheinen, ist eine andere Sache und hat nicht viel mit C zu tun.



  • Wer hat den jetzt recht ? -.-


Anmelden zum Antworten