Wie kann ich einen std::string in int konvertieren?

Lesezeit: 7 Minuten

Wie kann ich einen stdstring in int konvertieren
Brandon

Ich möchte einen String in ein Int konvertieren und ich meine keine ASCII-Codes.

Für einen schnellen Überblick werden wir in einer Gleichung als Zeichenfolge übergeben. Wir sollen es zerlegen, richtig formatieren und die linearen Gleichungen lösen. Nun, wenn ich das sage, bin ich nicht in der Lage, einen String in ein Int umzuwandeln.

Ich weiß, dass die Zeichenfolge entweder das Format (-5) oder (25) usw. haben wird, also ist es definitiv ein Int. Aber wie extrahieren wir das aus einer Zeichenfolge?

Eine Möglichkeit, die ich mir überlegt habe, besteht darin, eine for/while-Schleife durch die Zeichenfolge zu führen, nach einer Ziffer zu suchen, danach alle Ziffern zu extrahieren und dann nachzusehen, ob ein führendes ‘-‘ vorhanden ist. Wenn ja, multiplizieren Sie das int mit – 1.

Es scheint jedoch ein bisschen zu kompliziert für ein so kleines Problem zu sein. Irgendwelche Ideen?

  • Hast du es versucht atoi()?

    – i_am_jorf

    5. Oktober 2011 um 15:26 Uhr

  • cplusplus.com/reference/clibrary/cstdlib/atoi

    – i_am_jorf

    5. Oktober 2011 um 15:26 Uhr

  • stackoverflow.com/search?q=convert+string+int++c%2B%2B

    – Kiril Kirow

    5. Oktober 2011 um 15:27 Uhr

  • @Chad Sie empfehlen ihm also, eine ganze Bibliothek für etwas zu verwenden, das die Sprache sowieso mit Standardbibliotheken machen kann?

    – Bojangles

    5. Oktober 2011 um 15:30 Uhr

  • @Brandon, wenn du eine hast std::string myStringund verwenden möchten atoidann willst du sagen atoi(myString.c_str()).

    – Robᵩ

    5. Oktober 2011 um 15:44 Uhr


1647178811 352 Wie kann ich einen stdstring in int konvertieren
tgmath

In C++11 gibt es einige nette neue Konvertierungsfunktionen von std::string zu einem Zahlentyp.

Also statt

atoi( str.c_str() )

Sie können verwenden

std::stoi( str )

wo str ist Ihre Nummer als std::string.

Es gibt Versionen für alle Arten von Zahlen:
long stol(string), float stof(string), double stod(string),… sehen http://en.cppreference.com/w/cpp/string/basic_string/stol

  • Für Probleme mit std::stoi siehe stackoverflow.com/a/6154614/195527 : es wird konvertiert "11x" ganzzahlig 11.

    – CC.

    17. Juli 2015 um 20:37 Uhr

  • #include /* atoi */

    – Ulad Kasach

    12. April 2016 um 19:54 Uhr

  • @CC Das ist auch das Verhalten von atoi: cplusplus.com/reference/cstdlib/atoi “Der String kann nach denen, die die ganze Zahl bilden, weitere Zeichen enthalten, die ignoriert werden und keinen Einfluss auf das Verhalten dieser Funktion haben.”

    – Zinn-Zauberer

    25. Juli 2016 um 20:22 Uhr

  • Würde es Ihnen etwas ausmachen, diese Antwort mit zu aktualisieren from_chars von C++17? Es soll um Größenordnungen schneller sein als stoi.

    – NathanOliver

    29. Juli 2019 um 12:44 Uhr

  • stoi sollte bevorzugt werden. Siehe Warum sollte ich atoi() nicht verwenden?

    – phuklv

    18. Januar 2020 um 16:44 Uhr

Wie kann ich einen stdstring in int konvertieren
Claudio

Die möglichen Optionen werden im Folgenden beschrieben:

1. sscanf()

    #include <cstdio>
    #include <string>

        int i;
        float f;
        double d;
        std::string str;

        // string -> integer
        if(sscanf(str.c_str(), "%d", &i) != 1)
            // error management

        // string -> float
        if(sscanf(str.c_str(), "%f", &f) != 1)
            // error management
    
        // string -> double 
        if(sscanf(str.c_str(), "%lf", &d) != 1)
            // error management

Dies ist ein Fehler (wird auch von cppcheck angezeigt), weil “scanf ohne Feldbreitenbegrenzung kann bei manchen Versionen von libc mit riesigen Eingabedaten abstürzen” (siehe hier und hier).

2. std::sto()*

    #include <iostream>
    #include <string>

        int i;
        float f;
        double d;
        std::string str;

        try {
            // string -> integer
            int i = std::stoi(str);

            // string -> float
            float f = std::stof(str);

            // string -> double 
            double d = std::stod(str);
        } catch (...) {
            // error management
        }   

Diese Lösung ist kurz und elegant, aber nur auf C++11-kompatiblen Compilern verfügbar.

3. Ströme

    #include <string>
    #include <sstream>

        int i;
        float f;
        double d;
        std::string str;

        // string -> integer
        std::istringstream ( str ) >> i;

        // string -> float
        std::istringstream ( str ) >> f;

        // string -> double 
        std::istringstream ( str ) >> d;

        // error management ??

Mit dieser Lösung ist es jedoch schwierig, schlechte Eingaben zu unterscheiden (siehe hier).

4. lexical_cast von Boost

    #include <boost/lexical_cast.hpp>
    #include <string>

        std::string str;

        try {
            int i = boost::lexical_cast<int>( str.c_str());
            float f = boost::lexical_cast<int>( str.c_str());
            double d = boost::lexical_cast<int>( str.c_str());
            } catch( boost::bad_lexical_cast const& ) {
                // Error management
        }

Dies ist jedoch nur ein Wrapper von sstreamund die Dokumentation schlägt die Verwendung vor sstream für ein besseres Fehlermanagement (siehe hier).

5. strto()*

Diese Lösung ist aufgrund des Fehlermanagements sehr langwierig und wird hier beschrieben. Da keine Funktion ein einfaches int zurückgibt, ist im Falle einer Ganzzahl eine Konvertierung erforderlich (siehe hier, wie diese Konvertierung erreicht werden kann).

6. Quart

    #include <QString>
    #include <string>

        bool ok;
        std::string;

        int i = QString::fromStdString(str).toInt(&ok);
        if (!ok)
            // Error management
    
        float f = QString::fromStdString(str).toFloat(&ok);
        if (!ok)
            // Error management 

        double d = QString::fromStdString(str).toDouble(&ok);
        if (!ok)
    // Error management     
    

Schlussfolgerungen

Zusammenfassend ist die beste Lösung C++11 std::stoi() oder als zweite Option die Verwendung von Qt-Bibliotheken. Von allen anderen Lösungen wird abgeraten oder sie sind fehlerhaft.

  • Fest. Danke für die Meldung.

    – Claudio

    20. Juli 2017 um 15:35 Uhr

  • Schöne Zusammenfassung, vielen Dank. Darf ich vorschlagen, einen ersten Kommentar hinzuzufügen, der die endgültige Lösung vorschlägt, damit nur Leute, die an den Details interessiert sind, weiterlesen?

    – Lukas

    13. Juli 2018 um 16:46 Uhr

  • Dies sollte die akzeptierte Antwort sein, auch Sie haben from_chars vergessen (oder sollten eher hinzufügen, weil es eine alte Antwort ist).

    – Ausnahme

    6. September 2019 um 8:56 Uhr


  • Nicht verwenden sscanf. Es ist eine C-API-Funktion, und die Frage bezieht sich auf C++. Wenn Sie vorhaben zu verwenden sscanf dann wenigstens verwenden std::.

    – Marc Dirven

    1. Juli 2021 um 9:14 Uhr

std::istringstream ss(thestring);
ss >> thevalue;

Um vollständig korrekt zu sein, sollten Sie die Fehler-Flags überprüfen.

  • Dies wird nicht extrahiert -5 von (-5).

    – Nawaz

    5. Oktober 2011 um 15:32 Uhr

  • @Nawaz, sind die Parens tatsächlich da, oder präsentiert das OP nur so seine Saiten?

    – Winston Ewert

    5. Oktober 2011 um 15:35 Uhr

  • Ich weiß nicht. Ich weise nur auf die Grenzen des Ansatzes hin.

    – Nawaz

    5. Oktober 2011 um 15:38 Uhr

  • @Nawaz, Es kann auch nicht mit dem Eingang “WERWER” arbeiten. Ich glaube nicht, dass die Klammern tatsächlich Teil seiner eigentlichen Zeichenfolge sind, und ich denke nicht, dass die Tatsache, dass ich sie nicht parse, relevant ist.

    – Winston Ewert

    5. Oktober 2011 um 18:10 Uhr

  • @Nawaz, ok … Ich nehme das Wort nicht so, aber ich verstehe, wie Sie könnten.

    – Winston Ewert

    5. Oktober 2011 um 18:16 Uhr

1647178812 718 Wie kann ich einen stdstring in int konvertieren
brenjt

Verwenden Sie die Atoi-Funktion, um die Zeichenfolge in eine Ganzzahl umzuwandeln:

string a = "25";

int b = atoi(a.c_str());

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

1647178813 492 Wie kann ich einen stdstring in int konvertieren
Paskal h.

Um vollständiger zu sein (und wie in Kommentaren angefordert), füge ich die von C++17 angegebene Lösung hinzu std::from_chars.

std::string str = "10";
int number;
std::from_chars(str.data(), str.data()+str.size(), number);

Wenn Sie überprüfen möchten, ob die Konvertierung erfolgreich war:

std::string str = "10";
int number;
auto [ptr, ec] = std::from_chars(str.data(), str.data()+str.size(), number);
assert(ec == std::errc{});
// ptr points to chars after read number

Um die Leistung all dieser Lösungen zu vergleichen, siehe außerdem den folgenden Quick-Bench-Link: https://quick-bench.com/q/GBzK53Gc-YSWpEA9XskSZLU963Y

(std::from_chars ist am schnellsten u std::istringstream ist am langsamsten)

1647178814 656 Wie kann ich einen stdstring in int konvertieren
Benutzer2235747

1. std::stoi

std::string str = "10";  
int number = std::stoi(str); 

2. Saitenströme

std::string str = "10";  
int number;  
std::istringstream(str) >> number

3. boost::lexical_cast

#include <boost/lexical_cast.hpp>
std::string str = "10";  
int number;
    
try 
{
    number = boost::lexical_cast<int>(str);
    std::cout << number << std::endl;
}
catch (boost::bad_lexical_cast const &e) // bad input
{
    std::cout << "error" << std::endl;
}

4. std::atoi

std::string str = "10";
int number = std::atoi(str.c_str()); 

5. sscanf()

 std::string str = "10";
 int number;
 if (sscanf(str .c_str(), "%d", &number) == 1) 
 {
     std::cout << number << '\n';
 } 
 else 
 {
     std::cout << "Bad Input";
 }

Wie kann ich einen stdstring in int konvertieren
Claudio

Wie wäre es mit Boost.Lexical_cast?

Hier ist ihr Beispiel:

Das folgende Beispiel behandelt Befehlszeilenargumente als eine Folge numerischer Daten:

int main(int argc, char * argv[])
{
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector<short> args;

    while(*++argv)
    {
        try
        {
            args.push_back(lexical_cast<short>(*argv));
        }
        catch(bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }
    ...
}

  • Die Verbindung ist unterbrochen. Könntest du es reparieren?

    – Yuchen

    7. März 2016 um 17:45 Uhr

997920cookie-checkWie kann ich einen std::string in int konvertieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy