int und string verbinden und in ein String herausgeben



  • Hallo Leute ich habe folgendes Problem,

    ich versuche schon die ganze Zeit eine int und String in einem String zu verbinden.
    folgender Maße versuche ich es:

    string prefix;
    	int suffix;
    	string RefDef;
             string RefDef1;
    
             RefDef1 = sprintf (RefDef, "%s%d", prefix, suffix);
    

    Ich bekomme aber immer diesen Fehler.
    *error C2664: 'sprintf' : cannot convert parameter 1 from 'std::string' to 'char '
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

    Gruß Stefan



  • Na dann weißt du ja was du zu tun hast. sprintf will also keinen std::string to sondern char *. Also etwas wie char RefDef[n].



  • Falsches Forum: Ansi C wäre korrekt.

    Simon



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • std::stringstream sstr;
    sstr << prefix << suffix;
    std::string result = sstr.str();
    


  • Hallo danke für eure Hilfe aber jetzt kriege ich mit dem Code.

    string prefix;
    	int suffix;
    	stringstream RefDef;
    
    	RefDef << prefix << suffix; 
    	std::string result = RefDef.c_str();
    

    folgende Fehler

    ***error C2228: left of '.c_str' must have class/struct/union
    type is 'int'
    error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'int' (or there is no acceptable conversion)

    error C2079: 'RefDef' uses undefined class 'std::basic_stringstream<_Elem,_Traits,_Alloc>'
    with
    [
    _Elem=char,
    _Traits=std::char_traits,
    _Alloc=std::allocator
    ]***



  • #include <sstream>

    RefDef.c_str() -> RefDef.str()



  • Also es hat funktioniert so wie dei Lösungsvorschläge waren.
    Aber bei der Übergabe stand in dem String [null], was falsch ist.
    mir ist aufgefallen, dass wenn ich .c_str() hinter prefix schreibe, dann wird in dem String prefix AND geschrieben, was stimmt!

    Aber wenn ich RefDef << prefix.c_str << suffix; schreibe, kriege ich den Fehler.

    error C3867: 'std::basic_string<_Elem,_Traits,_Ax>::c_str': function call missing argument list; use '&std::basic_string<_Elem,_Traits,_Ax>::c_str' to create a pointer to member
    with
    [
    _Elem=char,
    _Traits=std::char_traits,
    _Ax=std::allocator
    ]

    Code momentan

    string prefix;
    	int suffix;
    	stringstream RefDef;
    
    		prefix = m_pArrayPlistElem[i]->m_prefix;
    		suffix = m_pArrayPlistElem[i]->m_suffix;
    		RefDef << prefix.c_str << suffix; 
    	//	std::string result = RefDef.str();
    	//	fprintf(fp,"%s",prefix.c_str());
    

    Vielelicht als neben bei!
    Ich muss den Code den unserer Prof . geschrieben hat ergänzen.
    Der Prof. schweigt leider und lächelt!!



  • swunder schrieb:

    ... Ich muss den Code den unserer Prof . geschrieben hat ergänzen.

    .. und wer hat Dir 'sprintf' und 'fprintf' beigebracht? War das der Prof? Dann gib' uns mal die FH/TU und den Namen. Wir müssen endlich mal was gegen diese Leute machen, die Heerscharen von Studenten in den C++-Kursen die veralteten C-Statements beibringen.

    Einige hier zeigen nur noch reflexartige Reaktionen: z.B.:

    theta schrieb:

    Falsches Forum: Ansi C wäre korrekt.

    Gruß
    Werner



  • Werner Salomon schrieb:

    .. und wer hat Dir 'sprintf' und 'fprintf' beigebracht? War das der Prof? Dann gib' uns mal die FH/TU und den Namen. Wir müssen endlich mal was gegen diese Leute machen, die Heerscharen von Studenten in den C++-Kursen die veralteten C-Statements beibringen.

    Ja, total. Aber das wäre wahrscheinlich ziemlich aussichtslos, bei dem vielen existierenden "Halbwissen"...

    Es gibt nebenbei massenhaft unbrauchbare C++-Bücher, die auch nicht gerade wenig zu schlechtem Programmierstil beitragen. Wenn man nicht in Foren wie diesem auf seinen Code aufmerksam gemacht wird, kann es gut sein, dass man unbehelligt so weiterprogrammiert, bis man sich vielleicht später im Beruf umgewöhnen muss. Schlimmer sieht es aus, wenn die Firma ebenfalls Wert auf veraltete und unübliche Techniken setzt.

    Schlussendlich hat man sein Leben verbracht, ohne jemals erleuchtet worden zu sein. 😉



  • habt Ihr vielleicht eine Lösung wie man es besser machen kann?



  • Ganz allgemein:

    Statt print-Funktionen aus C zu neutzen sollte man C++-Streams benutzen:

    #include <string>   // std::string (Strings)
    #include <iostream> // std::cout, std::cin, std::cerr, ... (Standard-Ein-/Ausgabe)
    #include <fstream>  // std::fstream, std::ifsream, std::ofstream,... (Datei-IO)
    #include <sstream>  // std::stringstream ("Brücke zwischen Strings und Streams")
    
    int main(){
    
       int zufahlszahl = 11; // reiner Zufall ;)
    
       // Begrüßung und Namen ermitteln:
       std::cout << "Hallo, bitte sagen Sie mir Ihren Namen: ";
       std::cout.flush();
       std::string name;
       std::cin >> name;
    
       // personalisierte Glückszahlausgabe
       std::cout << "\nHallo " << name << "! Ihre Glückszahl ist heute die " << zufahlszahl << std::endl;
    
       // Dateiname erzeugen:
       int dateiIndex = 123;
       std::stringstream dateiName;
       dateiName << "Daten_" << dateiIndex << ".txt";
    
       // Daten speichern (Name + Glückzahl in hex)::
       std::fstream logFile(dateiName.str().c_str(), std::ios::out | std::ios::app);
       logFile << "Benutername: " << name
               << " Glückszahl: " << std::hex  << zufahlszahl
               << std::endl;
    
       return 0;
    }
    


  • Hallo Leute,

    also ich habe jetzt auch mit dem Code probiert.
    Aber mit diesem Code gebe ich nur ein string zusammen mit einem int in ein File.
    Das ist ja nicht das Problem. Das habe ich geschaft.

    Aber wie schaffe ich es int und string in einen String zusammen zu fassen?

    Das kann doch nicht so schwer sein! 😕

    Gruß Steve



  • swunder schrieb:

    Aber wie schaffe ich es int und string in einen String zusammen zu fassen?

    Was verstehst du denn unter "zusammenfassen", wenn dir keine der von Roger Wilco gezeigten Möglichkeiten zusagt? Tipp: Schau mal die Stelle mit std::stringstream an.



  • swunder schrieb:

    Aber wie schaffe ich es int und string in einen String zusammen zu fassen?

    Ich habs so geschafft:

    #include <string>
    #include <sstream>
    
    int main()
    {
    	std::string prefix;
    	std::string RefDef1;
    	int suffix;
    	std::stringstream sstr;
    
    	prefix = "Hallo";
    	suffix = 123;
    
    	sstr << prefix << suffix;
    
    	RefDef1 = sstr.str();
    	std::cout << "string version:" << RefDef1 << std::endl;
    
    	RefDef1 = sstr.str().c_str();
    	std::cout << "char* version:" << RefDef1 << std::endl;
    
    	std::cin.get();
    	return 0;
    }
    

    Oder ich versteh nicht genau, worum es hier geht...

    Viel Glück noch, und ach ja, schau mal hier http://www.cplusplus.com/reference/iostream/stringstream/, die Seite solltest Du Dir auf jeden Fall in die Lesezeichen stecken 😋



  • std::string + int = std::string:

    rüdiger schrieb:

    std::stringstream sstr;
    sstr << prefix << suffix;
    std::string result = sstr.str();
    

    prefix und suffix können dabei ein beliebiger Datentyp sein, für den der operator<< definiert ist (std::string, char*, int, long, float,...)

    so auch:

    std::string prefix = "Text";
    int suffix = 1;
    
    std::stringstream sstr;
    sstr << prefix << suffix;
    std::string result = sstr.str(); // result == "Text1"
    


  • also es funktionier jetzt alles-
    So wie ihr das vorgeschlgaen habt.
    Bloss ich habe ein Problem

    string prefix;
    	int suffix;
    	stringstream sstr;
    	string RefDef[100];
    
    	int n=m_listComponent.size();
    	for(int i=0;i<n;i++){
    		prefix = m_pArrayPlistElem[i]->m_prefix;
    		suffix = m_pArrayPlistElem[i]->m_suffix;
    
    		sstr << prefix << suffix;
    		RefDef[i] = sstr.str();
    
    		}
    
    	for(int i=0;i<n;i++){
    		fprintf(fp,"%s\n",RefDef[i].c_str());
    		}
    

    Folgendes habe kriege ich in fp file

    AND1
    AND1IN1
    AND1IN1IN2
    AND1IN1IN2OR1
    AND1IN1IN2OR1XOR1

    Erwartet habe ich aber

    AND1
    AND1
    IN1
    IN2
    OR1
    XOR1

    Was mache ich falsch? Oder muss ich immer die sstr Variable immer "löschen"?

    Wenn ja wie mache ich es?



  • also es funktionier jetzt alles-
    So wie ihr das vorgeschlgaen habt.
    Bloss ich habe ein Problem

    string prefix;
    	int suffix;
    	stringstream sstr;
    	string RefDef[100];
    
    	int n=m_listComponent.size();
    	for(int i=0;i<n;i++){
    		prefix = m_pArrayPlistElem[i]->m_prefix;
    		suffix = m_pArrayPlistElem[i]->m_suffix;
    
    		sstr << prefix << suffix;
    		RefDef[i] = sstr.str();
    
    		}
    
    	for(int i=0;i<n;i++){
    		fprintf(fp,"%s\n",RefDef[i].c_str());
    		}
    

    Folgendes habe kriege ich in fp file

    AND1
    AND1IN1
    AND1IN1IN2
    AND1IN1IN2OR1
    AND1IN1IN2OR1XOR1

    Erwartet habe ich aber


    AND1
    IN1
    IN2
    OR1
    XOR1***

    Was mache ich falsch? Oder muss ich immer die sstr Variable immer "löschen"?

    Wenn ja wie mache ich es?



  • sstr.str("");
    


  • Nexus schrieb:

    sstr.str("");
    

    oder sstr erst in der schleife deklarieren.

    //    stringstream sstr;
    //    string RefDef[100];
        vector<string> RefDef; //#include <vector>
    
        int n=m_listComponent.size();
    
        for(int i=0; i<n; i++){
            string prefix = m_pArrayPlistElem[i]->m_prefix;
            int suffix = m_pArrayPlistElem[i]->m_suffix;
    
            stringstream sstr;
            sstr << prefix << suffix;
    //        RefDef[i] = sstr.str();
            RefDef.push_back(sstr.str());
            }
    
        for(int i=0;i<n;i++){
    //        fprintf(fp,"%s\n",RefDef[i].c_str());
            cout << RefDef[i] << endl;
            }
    

    also ohne den ganzen müll drin:

    vector<string> RefDef;
    
        int n=m_listComponent.size();
    
        for(int i=0; i<n; i++){
            string prefix = m_pArrayPlistElem[i]->m_prefix;
            int suffix = m_pArrayPlistElem[i]->m_suffix;
    
            stringstream sstr;
            sstr << prefix << suffix;
            RefDef.push_back(sstr.str());
            }
    
        for(int i=0;i<n;i++){
            cout << RefDef[i] << endl;
            }
    

    das könnte(sollte) man jetzt noch in ein paar vielsagende Funktionen unterteilen...

    falls du fragen zu vector hast, dann hier oder zur not kannste auch fragen

    bb


Anmelden zum Antworten