int an string anhaengen



  • komisch. bei mir funktioniert es so :D:

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    int main()
    {
    	int spaeter_stringstream_dann_string_zaehler = 7;
    	string erst_integer_dann_string_zaehler;
    	stringstream integer_string_stringstream;
    
    	integer_string_stringstream << spaeter_stringstream_dann_string_zaehler;
    	integer_string_stringstream >> erst_integer_dann_string_zaehler;
    	cout << erst_integer_dann_string_zaehler << endl;
    
        cin.get();
    }
    


  • naja, wenn man diese codemonster hier sieht, ist man doch froh, dass man nur 'C' verwendet und solche schönen funktionen wie atoi() und sprintf() hat 😉



  • Misteriös, dann mache ich sicher noch irgendwo anders einen Fehler...
    Ich schaue noch mal genau drüber, aber danke für die Hilfe.



  • Gebs zu atoi() ist kein C++, nichts desto trotz find ich die Lösung mit Streams nicht wirklich berauschend. Fände an dieser Stelle eine Memberfunktion wie sie z.B. CString hat viel sinnvoller.



  • net schrieb:

    naja, wenn man diese codemonster hier sieht, ist man doch froh, dass man nur 'C' verwendet und solche schönen funktionen wie atoi() und sprintf() hat 😉

    Was spricht eigentlich dagegen, sowas in C++ zu verwenden? (außer dem Aufwand, sich ein entsprechend großes char-Array zu verwalten)

    @schorch: Ja, ich weiß, in C++ können Variablenbezeichner beliebig lang werden. Aber man kann's auch übertreiben 😛



  • Hallo,

    ich bin immer noch am verzweifeln...

    Habe jetzzt mal folgendes ausprobiert:

    int zaehler;
    string str_zaehler;
    stringstream string_stringstream;
    
    string_stringstream << zaehler +1;
    string_stringstream >> str_zaehler;
    

    Was in zaehler steht, scheint überhaupt nicht zu interessieren.
    Resultat ist, dass bei string_stringstream 0 herauskommt und bei str_zaehler 1.

    Ich finde das sehr misteriös, denn wie kommt die 1 zu str_zaehler, wenn 0 in string_stringstream steht?????

    Ich sehe ja ein, dass ich irgendwo einen logischen Fehler machen muß, aber wo???



  • Schau doch hier mal nach ich hatte da auch erst letzens so meine Probleme:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-128289.html



  • An alle die sich fragen, warum kein atoi()? Bitte sagt mir was ihr bei sowas macht:

    int i = atoi("Hallo"); // Kann auch eine Variable übergeben werden... egal.
    

    Wie kann ich jetzt zur Laufzeit abfragen, ob atoi auch erfolgreich war? Als Ergebnis für das obige Bsp. bekomme ich wohl 0 zurück? Jedenfalls einen Wert. Wie kann ich das Ergebnis von diesem hier unterscheiden:

    int i = atoi("0"); // Kann auch eine Variable übergeben werden... egal.
    

    Hem? 0 kommt natürlich als Ergebnis zurück. Wie kann ich unterscheiden, ob 0 deshalb raus kommt, weil es richtig oder falsch war??? (die Konvertierung meine ich)

    Leicht crazy das ganze! 😃 Ich könnte natürlich vorher den String auf korrektheit, also auf Alphas checken! Gut, aber dann sind das auch zwei und mehr Codezeilen. Also nicht wirklich weniger als bei einem std::stringstream! 💡 🙄 😃 🙂 :p :p :p



  • Hmm, du könntest ja auch strtol verwenden:

    char* epos,*text=/*irgendein Stringwert*/;
    int i=strtol(text,&epos,10);
    if(epos==text)
      cout<<"Konvertierungsfehler\n";
    else if(*epos!='\0')
      cout<<"unvollständige Konvertierung, Reststring:"<<epos<<endl;
    

    "Hallo" würde hier zu einem Konvertierungsfehler führen, "0" problemlos erkannt (und "47elf" würde i auf 47 setzen und den Reststring "elf" ausspucken).



  • vielleicht irgentwie so:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    bool meinatoi(char *was1, int *was2)
    {
     if(was1[0] < '0' || was1[0] > '9')
     {
      return false;
     }
     *was2 = atoi(was1);
     return true;
    }
    
    int main(int argc, char *argv[])
    {
        int bla;
        if(!meinatoi("$",&bla))
        {
            cout << "fehler" << endl;
        }
        else
        {
            cout << bla << endl;
        }
        if(!meinatoi("7",&bla))
        {
            cout << "fehler" << endl;
        }
        else
        {
            cout << bla << endl;
        }
        if(!meinatoi("Hallo",&bla))
        {
            cout << "fehler" << endl;
        }
        else
        {
            cout << bla << endl;
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Ja und? Sind eure selbstgemachten Beispiele kürzer als stringstream oder wie?

    Also, itoa hat nichts in einem sauberen C++ Projekt zu suchen. Es hat schon seinen Grund, warum es eine C++ Standardlib gibt.



  • Artchi schrieb:

    Ja und? Sind eure selbstgemachten Beispiele kürzer als stringstream oder wie?

    Also, itoa hat nichts in einem sauberen C++ Projekt zu suchen. Es hat schon seinen Grund, warum es eine C++ Standardlib gibt.

    Hää? Was willst du? Du fragst:

    Wie kann ich unterscheiden, ob 0 deshalb raus kommt, weil es richtig oder falsch war???

    Ich antworte mit der funktion die das macht. Wo ist das Problem? Von itoa war nie die Rede in meinem Beitrag??!

    mfg.



  • Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???



  • Artchi schrieb:

    Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???

    kA. Wollte dir nur zeigen dass das zeimlich einfach geht. naja was soll's, ist ja auch egal.

    mfg.



  • Ich glaub wenn die Standardlib bei Strings nicht so gruselig wäre würde auch kein Mensch mehr atoi benutzen. Bevor ich bei einem String-Stream wieder rausgefunden habe was clear und flush macht und das beides nicht das ist was ich will hab ich zehnmal atoi oder good old sprintf verwendet.



  • asdrubael schrieb:

    Ich glaub wenn die Standardlib bei Strings nicht so gruselig wäre würde auch kein Mensch mehr atoi benutzen. Bevor ich bei einem String-Stream wieder rausgefunden habe was clear und flush macht und das beides nicht das ist was ich will hab ich zehnmal atoi oder good old sprintf verwendet.

    vor allem wenn dann solche bekloppten sachen wie die winapi in c geschrieben sind. dann muss die ganze scheiße wieder umkonvertiert werden. Da bleib ich doch gleich bei denen.

    Aber wenn man sich richtig auskennt (was ich mich nicht tue), sind natürlich string und sstreams besser.

    mfg.



  • joomoo schrieb:

    Artchi schrieb:

    Sorry, meinte atoi... hab mich vertippt. Ändert aber an meiner Frage nichts: warum sollte ich atoi einsetzen anstatt stringstreams???

    kA. Wollte dir nur zeigen dass das zeimlich einfach geht. naja was soll's, ist ja auch egal.

    mfg.

    Mir ist durchaus bewusst, das ich mit weiteren C-Funktionen und if's zu dem Ziel hinkommen. Meine Frage auf Seite zwei war ja auch provokativ gemeint. Natürlich habt ihr mir die Bestätigung geliefert, das der C-Kram nicht kürzer ist als ein einfacher stringstream. Es ging darum, das jemand meinte, er findet stringstream vom Codeanteil her zu groß und atoi wäre ja kürzer. Stimmt aber nicht, weil in einer sicheren Programmumgebung viele Ausnahmefälle geprüft werden müssen, um Bugs zu verhindern. Das geht nur, wenn man mehr als nur atoi benutzt.

    Ergo kann man auch gleich stringstreams benutzen da dieses schon die Prüfungen durchführt, ohne das ich ein if und irgendwelche C-Stringfunktionen. Das war alles was ich sagen wollte.

    Wer es noch einfacher haben will (was ich auch in meinem ersten Post sagte, aber keiner reagiert hat) benutzt boost::lexical_cast.



  • joomoo schrieb:

    vor allem wenn dann solche bekloppten sachen wie die winapi in c geschrieben sind. dann muss die ganze scheiße wieder umkonvertiert werden. Da bleib ich doch gleich bei denen.

    Es gibt Smartwin! Wo die STL nicht ausreicht, wird dort boost verwendet. boost::lexical_cast ist auch dabei.


Anmelden zum Antworten