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?

2voto

Nun, viele Antworten, viele Möglichkeiten. Was mir hier fehlt, ist eine universelle Methode, die einen String in verschiedene C++-Integraltypen (short, int, long, bool, ...) konvertiert. Ich bin auf folgende Lösung gekommen:

#include<sstream>
#include<exception>
#include<string>
#include<type_traits>

using namespace std;

template<typename T>
T toIntegralType(const string &str) {
    static_assert(is_integral<T>::value, "Integral type required.");
    T ret;
    stringstream ss(str);
    ss >> ret;
    if ( to_string(ret) != str)
        throw invalid_argument("Can't convert " + str);
    return ret;
}

Hier sind Beispiele für die Verwendung:

string str = "123";
int x = toIntegralType<int>(str); // x = 123

str = "123a";
x = toIntegralType<int>(str); // throws exception, because "123a" is not int

str = "1";
bool y = toIntegralType<bool>(str); // y is true
str = "0";
y = toIntegralType<bool>(str); // y is false
str = "00";
y = toIntegralType<bool>(str); // throws exception

Warum nicht einfach den Stringstream-Ausgabeoperator verwenden, um eine Zeichenkette in einen ganzzahligen Typ zu konvertieren? Hier ist die Antwort: Angenommen, eine Zeichenkette enthält einen Wert, der den Grenzwert für den vorgesehenen Integraltyp überschreitet. Zum Beispiel ist unter Windows 64 max int 2147483647. Weisen wir einem String den Wert max int + 1 zu: string str = "2147483648". Nun, bei der Umwandlung der Zeichenkette in einen int:

stringstream ss(str);
int x;
ss >> x;

x wird zu 2147483647, was definitiv ein Fehler ist: der String "2147483648" sollte nicht in den int 2147483647 umgewandelt werden. Die bereitgestellte Funktion toIntegralType erkennt solche Fehler und löst eine Ausnahme aus.

1voto

Jichao Punkte 37992

Unter Windows können Sie das verwenden:

const std::wstring hex = L"0x13";
const std::wstring dec = L"19";

int ret;
if (StrToIntEx(hex.c_str(), STIF_SUPPORT_HEX, &ret)) {
    std::cout << ret << "\n";
}
if (StrToIntEx(dec.c_str(), STIF_SUPPORT_HEX, &ret)) {
    std::cout << ret << "\n";
}

strtol , stringstream Sie müssen die Basis angeben, wenn Sie hexadezimal interpretieren müssen.

1voto

Rodrigo Santos Punkte 99

Ich weiß, dass diese Frage schon sehr alt ist, aber ich denke, es gibt einen besseren Weg, dies zu tun

#include <string>
#include <sstream>

bool string_to_int(std::string value, int * result) {
  std::stringstream stream1, stream2;
  std::string stringednumber;
  int tempnumber;
  stream1 << value;
  stream1 >> tempnumber;
  stream2 << tempnumber;
  stream2 >> stringednumber;
  if (!value.compare(stringednumber)) {
    *result = tempnumber;
    return true;
  }
  else return false;
}

Wenn ich den Code richtig geschrieben habe, wird ein boolescher Wert zurückgegeben, der Ihnen sagt, ob die Zeichenkette eine gültige Zahl war, wenn false, war es keine Zahl, wenn true, war es eine Zahl und diese Zahl ist jetzt das Ergebnis, Sie würden dies auf diese Weise aufrufen:

std::string input;
std::cin >> input;
bool worked = string_to_int(input, &result);

1voto

klg Punkte 43

Sie können verwenden std::stringstream Hier ist ein Beispiel:

#include <iostream>
#include <sstream>
using namespace std;
string r;
int main() {
    cin >> r;
    stringstream tmp(r);
    int s;
    tmp >> s;
    cout << s;
    return 0;
}

0voto

user7967189 Punkte 9

De http://www.cplusplus.com/reference/string/stoi/

// stoi example
#include <iostream>   // std::cout
#include <string>     // std::string, std::stoi

int main ()
{
  std::string str_dec = "2001, A Space Odyssey";
  std::string str_hex = "40c3";
  std::string str_bin = "-10010110001";
  std::string str_auto = "0x7f";

  std::string::size_type sz;   // alias of size_t

  int i_dec = std::stoi (str_dec,&sz);
  int i_hex = std::stoi (str_hex,nullptr,16);
  int i_bin = std::stoi (str_bin,nullptr,2);
  int i_auto = std::stoi (str_auto,nullptr,0);

  std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
  std::cout << str_hex << ": " << i_hex << '\n';
  std::cout << str_bin << ": " << i_bin << '\n';
  std::cout << str_auto << ": " << i_auto << '\n';

  return 0;
}

Ausgabe:

2001, A Space Odyssey: 2001 und 2001, A Space Odyssey

40c3: 16579

-10010110001: -1201

0x7f: 127

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