String aus Zeichen zusammensetzen



  • Hi,
    es scheint als wäre
    s2 += toupper(s1[i]);
    nicht das gleiche wie
    s2 = s2 + toupper(s1[i]);

    Variante 1:

    #include <QCoreApplication>
    #include <iostream>
    #include <string>
    #include <cctype>
    
    using namespace std;
    
    const string& strToUpper(const string& s1)
    {
        static string s2 = "";
    
        for(int i = 0; i < s1.length(); i++)
            s2 += toupper(s1[i]);	//Keine Fehlermeldung
    
        return s2;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        string p = "abcd";
        cout << strToUpper(p);
    
        return a.exec();
    }
    

    Variante 2:

    #include <QCoreApplication>
    #include <iostream>
    #include <string>
    #include <cctype>
    
    using namespace std;
    
    const string& strToUpper(const string& s1)
    {
        static string s2 = "";
    
        for(int i = 0; i < s1.length(); i++)
            s2 = s2 + toupper(s1[i]);	//invalid operands to binary expression ('std::string' (aka 'basic_string<char,...
    
        return s2;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        string p = "abcd";
        cout << strToUpper(p);
    
        return a.exec();
    }
    

  • Mod

    Das Problem hier ist, dass toupper einen int zurück gibt, und der Compiler dann nicht so recht weiß, was er aus string + int machen soll, da beide Seiten gleichberechtigt sind. Ist der string fest gesetzt und soll er versuchen den int zu etwas passendem zu konvertieren? Oder soll er den string in irgendwas umwandeln das zu int passt? Er gibt dir in der Fehlermeldung eine ziemlich lange Liste aller Dinge, die vage in Frage kämen. Daher musst du ihm sagen, was du genau meinst:

    s2 = s2 + (char) toupper(s1[i]);
    

    Bei s2 += toupper(s1[i]); ist die linke Seite hingegen fest gesetzt und es ist klar, dass er nur Konvertierungen der rechten Seite ausprobieren kann, daher geht's dort ohne den Cast.

    ABER: Das Verhalten deiner Funktion ist grauenhaft. Wieso ist s2 static? Wieso gibst du eine const string& zurück? Hast du mal probiert, was passiert, wenn du deine Funktion mehrmals aufrufst?



  • Der Compiler gibt Fehlermeldungen nur aus, damit du sie kürzen kannst...



  • Danke!

    Vollständige Fehlermeldung:
    invalid operands to binary expression ('std::string' (aka 'basic_string<char, char_transit<char>, allocator<char> >') and 'int')

    Wenn ich die Funktion nochmal für einen zweiten String aufrufe wird dieser zweite String an den ersten drangehängt.
    Das ist natürlich nicht Sinn der Sache. Daher ist das die Lösung:

    #include <QCoreApplication>
    #include <iostream>
    #include <string>
    #include <cctype>
    
    using namespace std;
    
    string strToUpper(const string& s1)
    {
        string s2 = "";
    
        for(int i = 0; i < s1.length(); i++)
            s2 += toupper(s1[i]);
    
        return s2;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        string p = "abcd";
        cout << strToUpper(p) << endl;
    
        string d = "hijk";
        cout << strToUpper(d) << endl;
    
        return a.exec();
    }
    


  • @theAnfänger77 sagte in String aus Zeichen zusammensetzen:

    Vollständige Fehlermeldung:

    Das zweifle ich mal stark an.



  • @theAnfänger77 sagte in String aus Zeichen zusammensetzen:

    #include <string>
    #include <cctype>

    Die Wurzel deines Übels. Du frickelst dir aus 2 verschiedenen Sprachwelten was zusammen und wunderst dich, dass dabei Probleme auftreten.
    Nehme C oder C++ aber nicht beides.


Anmelden zum Antworten