Int an std::string anhängen



  • Ich will in einer Schleife Strings aufbauen nach dem Schema:
    COM0
    COM1
    ...
    COM99

    Das ganze ohne itoa oder sprintf. Momentan mach ich folgendes:

    string COMPort = "\\\\.\\COMxx";
    string portNum;
    stringstream sstr;
    
    for (int i = 0; i<100; i++)
    {
        sstr.clear();
    	sstr << i;
    	sstr >> portNum;
    	COMPort.replace(7, COMPort.size(), portNum);
        // Programm stellt was mit dem String an
    

    Das erscheint mir aber überhaupt nicht optimal. Weiß jemand einen eleganteren Weg?



  • Für string ist doch der + Operator überladen, oder?

    string COMPort = "\\\\.\\COM";
    string portNum;
    stringstream sstr;
    
    for (int i = 0; i<100; i++)
    {
            sstr.clear();
    	sstr << i;
    	sstr >> portNum;
    	COMPort += portNum;
        // Programm stellt was mit dem String an
    


  • Der + Operator ist aber in dem Fall nicht das was ich will. Der produziert dann COM1, COM12, COM123 usw. Mir ging es auch mehr drum wie man das ohne die temporäre String-Variable lösen kann.



  • Benutze eine andere String-Klasse, die mit Integers umgehen kann (unter Visual C++ z.B. CString).

    Der produziert dann COM1, COM12, COM123 usw.

    In dem Fall darfst du halt nicht immer mehr an den salben String anhängen:

    string COMBase="\\\\.\\COM";
    for(int i=0;i<100;++i)
    {
      string COMPort=COMBase+itos(i);
      //Verarbeitung
    }
    

    (die itos()-Funktion kapselt eine Möglichkeit, int nach string umzuwandeln - z.B. über den stringstream)



  • boost::lexical_cast<> 🤡

    Gruß



  • std::stringstream ss;
    ss << "\\\.\\COM" << 2; // hier die Variable einsetzen
    std::string s = ss.str();



  • gruß schrieb:

    std::stringstream ss;
    ss << "\\\.\\COM" << 2; // hier die Variable einsetzen
    std::string s = ss.str();

    Sieht vielversprechend aus produziert bei mir aber noch ein
    + COMPort {"\.\COM3\.\COM4\.\COM5\.\COM6\.\COM7\.\COM8"} std::basic_string<char,std::char_traits<char>,std::allocator<char> >

    ss.flush() und ss.clear() machen nicht wirklich das was ich von ihnen erwarte.

    /Edit:
    Ok ss.str("") ist zwar irgendwie auch nicht der Hit, aber tut was es soll.



  • versuch's doch einfach mit "ss.str("");"



  • Ok, habe jetzt folgendes versucht.

    string_stringstream << zaehler;
    str_zaehler = string_stringstream.str();

    Nun schreibt er mir die auffeinanderfolgenden Werte hintereinander:
    str_zaehler 1
    str_zaehler 12
    str_zaehler 123

    habe schon string_stringstream.clear()
    und str_zaehler.clear()

    versucht, aber das hilft auch nichts.

    So kompliziert kann das doch nicht sein???



  • Lies doch mal meinen letzten Beitrag:

    stringstream conv;
    for(i=1;i<limit;++i)
    {
      conv<<"\\\\.\\COM"<<i;
      string port=conv.str();
      //arbeite mit port
      conv.str("");
    }
    

    (stream::clear() löscht die Fehlerflags des Streams, ist hier also nicht wirklich nützlich, string::clear() löscht den String-Inhalt - da du aber sofort etwas neues drüberschreibst, ist es prinzipiell unnötig)


Anmelden zum Antworten