769 Stimmen

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

Ich möchte einen String in einen int konvertieren, und ich meine nicht ASCII-Codes.

Für einen schnellen Durchlauf wird uns eine Gleichung als String übergeben. Wir sollen sie aufschlüsseln, richtig formatieren und die linearen Gleichungen lösen. Ich bin nicht in der Lage, eine Zeichenkette in eine Zahl zu konvertieren.

Ich weiß, dass die Zeichenfolge entweder im Format (-5) oder (25) usw. sein wird, also ist es definitiv ein int. Aber wie extrahieren wir das aus einem String?

Eine Möglichkeit, die ich dachte, ist das Ausführen einer for/while-Schleife durch die Zeichenfolge, überprüfen Sie für eine Ziffer, extrahieren Sie alle Ziffern nach, dass und dann zu sehen, wenn es eine führende '-', wenn es ist, multiplizieren Sie die int mit -1.

Für ein so kleines Problem scheint es allerdings etwas zu kompliziert zu sein. Irgendwelche Ideen?

14voto

user2235747 Punkte 284

1. std::stoi

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

2. String-Streams

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. s

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";
 }

10voto

Robᵩ Punkte 153060

Was ist mit Boost.Lexical_cast ?

Hier ist ihr Beispiel:

Im folgenden Beispiel werden Befehlszeilenargumente als eine Folge von numerischen Daten behandelt:

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);
        }
    }
    ...
}

7voto

Nawaz Punkte 339767

Zugegeben, meine Lösung funktioniert nicht für negative ganze Zahlen, aber sie extrahiert alle positiven ganzen Zahlen aus einem Eingabetext, der ganze Zahlen enthält. Sie nutzt die numeric_only Ort:

int main() {
        int num;
        std::cin.imbue(std::locale(std::locale(), new numeric_only()));
        while ( std::cin >> num)
             std::cout << num << std::endl;
        return 0;
}

Text eingeben:

 the format (-5) or (25) etc... some text.. and then.. 7987...78hjh.hhjg9878

Ganze Zahlen ausgeben:

 5
25
7987
78
9878

Die Klasse numeric_only ist definiert als:

struct numeric_only: std::ctype<char> 
{
    numeric_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        std::fill(&rc['0'], &rc[':'], std::ctype_base::digit);
        return &rc[0];
    }
};

Vollständige Online-Demo : http://ideone.com/dRWSj

4voto

Manish Kumawat Punkte 101

In C++11 können wir verwenden "stoi" Funktion zur Umwandlung von String in einen int

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1 = "16";
    string s2 = "9.49";
    string s3 = "1226";

    int num1 = stoi(s1);
    int num2 = stoi(s2);
    int num3 = stoi(s3);

    cout << "stoi(\"" << s1 << "\") is " << num1 << '\n';
    cout << "stoi(\"" << s2 << "\") is " << num2 << '\n';
    cout << "stoi(\"" << s3 << "\") is " << num3 << '\n';

    return 0;
}

4voto

James Kanze Punkte 146902

Wahrscheinlich ist es ein bisschen übertrieben, aber boost::lexical_cast<int>( theString ) sollte zum Job recht gut erfüllen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X