Mehrere Variablen und Strings in einer Messagebox



  • Hallo,

    Wie kann ich mehrere Variablen mit strings verknüpfen und das Ergebnis in einer MessageBox() anzeigen?

    char Variable1
    char Variable2[10]
    

    Der Text in der Messagebox soll dann sein:
    "Das Zeichen Variable1 kommt Variable2 mal in der Datei vor!"
    Natürlich sollen da statt der Namen der Variblen deren Inhalt stehen.

    Ich habe bereits versucht eine Variable "string buff" zu erstellen und dann:

    buff = "Das Zeichen " + Variable1 + " kommt " + Variable2 + " mal in der Datei vor!"
    

    Das Funktioniert allerdings nicht, da ich dann bei dem " kommt " den Fehler "Fehler: Der Ausdruck muss einen ganzzahligen Enumerationstyp oder einen Enumerationstyp ohne Bereichseinschränkung aufweisen" bekomme.

    Wenn ich folgendes mache:

    buff = "Das Zeichen " + Variable1;
    buff = buff +  " kommt " + Variable2 + " mal in der Datei vor!";
    

    Gibt es zwar keinen Fehler aber der Text in der Messagebox beginnt mit dem 'n' am Ende von "Zeichen" und der Inhalt von Variable1 wird einfach nicht angezeigt.

    Hat jemand eine Lösung für mich?
    Ich verstehe nicht warum ich mit einer möglichkeit einen Fehler bekomme und mit einer anderen nur ein Teil des Textes da steht.



  • Kann mir jemand mal folgendes erklären?

    MessageBox(hWnd, L"So oft kommt das Zeichen vor: %d" + countchar , L"Anzahl des Zeichens", MB_OK);
    
    MessageBox(hWnd, L"Error", L"Error", MB_ICONERROR | MB_OK);
    

    Die obere MessageBox zeigt als Text "mt das Zeichen vor: %d" an und Die untere zeigt wie gewünscht "Error" an.

    Wo ist das Problem bei der oberen?
    Wenn sie schon nicht den Inhalt der Variable anzeigt, warum zeigt sie die ersten zweieinhalb Wörter nicht an???? 😕



  • Das hat nichts mit MFC zu tun, das ist Win-API mit C++. Nein, eigentlich ist es nur C++.

    Was du willst, ist std::stringstream :

    #include <string>
    #include <sstream>
    #include <iostream>
    
    int main(void)
    {
            std::stringstream buff;
            const char*cstr; /*Passt fuer MessageBox.*/
    
            buff << "Das Zeichen " << 1 << " kommt " << 2 << " mal in der Datei vor!";
            cstr = buff.str().c_str();
            std::cout << cstr << "\n";
            return 0;
    }
    

    Ausgabe:

    Das Zeichen 1 kommt 2 mal in der Datei vor!
    

    Wenn du c++ string concatenation gegoogelt hättest, wäre der erste Treffer genau das gewesen.

    XP schrieb:

    Wo ist das Problem bei der oberen?
    Wenn sie schon nicht den Inhalt der Variable anzeigt, warum zeigt sie die ersten zweieinhalb Wörter nicht an???? 😕

    Einfache C-Zeigerarithmetik. Du übergibst MessageBox keinen String an sich, sondern die Adresse, an der sich ein String befindet. Sowas wie 0x400102d oder so. Das ist aber ein nativer C-String, kein std::string , sprich, wenn du darauf addierst, wird nicht verkettet, sondern wirklich ein Wert auf die Adresse addiert, bevor sie MessageBox übergeben wird. Sodass aus 0x400102d 0x4001036 oder dergleichen wird. Und an der Stelle bist du natürlich mitten im String (oder schon jenseits des NUL-Bytes).

    Wie viele Zeichen verschluckt werden, hängt dann vom Wert in countchar ab.



  • Danke für die Antwort.

    Ich habe jetzt deinen Code angewendet:

    stringstream buff;
    const char*buff2;
    
    buff << "Das Zeichen '" << c << "' kommt " << countchar << " mal in der Datei vor!";
    buff2 = buff.str().c_str();
    MessageBoxA(hWnd, buff2 , "Anzahl des Zeichens", MB_OK|MB_ICONINFORMATION);
    

    Das Ergebnis ist allerdings nicht so gut.
    Die Messagebox bleibt entweder komplett ohne Text oder gibt eine Zeile 'Ý' und dann einmal einen kleinen rechteckigen Kasten aus.
    Kann das daran liegen das c ein char und countchar ein int ist?



  • Nein, der Fehler liegt bei mir, weil ich blöd bin. Das obrige Programm habe ich mit dem g++ auf Linux kompiliert, da tut es, aber Windows scheint bei der Speicherverwaltung ein wenig anders zu machen. Das Problem ist, dass das Objekt, welches von str() zurückkommt, keine Referenz, sondern ein eigenes Objekt ist. Welches nur für die Lebensdauer der Anweisung valide ist. Der Zeiger, den c_str zurückgibt, ist somit ungültig.

    Sollte sich so fixen lassen:

    std::stringstream buff_stream;
    std::string buff_string;
    const char*buff;
    
    buff_stream << "Das Zeichen '" << (int)c << "' kommt " << countchar << " mal in der Datei vor!";
    buff_string = buff_stream.str();
    buff = buff_string.c_str();
    

    Mit dem (int)c sorgst du dafür, dass das Objekt als ein anderer Typ behandelt wird.
    Alternativ kannst du auch static_cast<int>(c) verwenden, aber ich bin ein C-Programmierer, und es funktioniert auch so.



  • Vielen Dank!
    Jetzt funktioniert es!


Log in to reply