C++ 11, należy std::stoi
jako:
std::string s = "10";
int i = std::stoi(s);
Należy zauważyć, że std::stoi
rzuci wyjątek typu std::invalid_argument
, że konwersja nie może być wykonane, albo std::out_of_range
jeśli wyniki konwersji w przelew (tj gdy wartość ciągu jest zbyt duża dla typu int
). Można użyć std::stol
lub std:stoll
, jednak w przypadku, gdy int
wydaje się zbyt mały dla wejściowego ciągu znaków.
w C++ 03/98, jedną z następujących czynności można stosować:
std::string s = "10";
int i;
//approach one
std::istringstream(s) >> i; //i is 10 after this
//approach two
sscanf(s.c_str(), "%d", &i); //i is 10 after this
Należy zauważyć, że powyższe dwa podejścia byłoby nie do wejścia s = "10jh"
. Zwrócą 10, zamiast zgłaszać błąd. Bezpiecznym i niezawodnym podejściem jest napisanie własnej funkcji, która analizuje ciąg wejściowy i weryfikowanie każdego znaku w celu sprawdzenia, czy jest to cyfra, czy nie, a następnie działa odpowiednio. Oto jeden solidny implemtation (przetestowane chociaż) wersja
int to_int(char const *s)
{
if (s == NULL || *s == '\0')
throw std::invalid_argument("null or empty string argument");
bool negate = (s[0] == '-');
if (*s == '+' || *s == '-')
++s;
if (*s == '\0')
throw std::invalid_argument("sign character only.");
int result = 0;
while(*s)
{
if (*s >= '0' && *s <= '9')
{
result = result * 10 - (*s - '0'); //assume negative number
}
else
throw std::invalid_argument("invalid input string");
++s;
}
return negate ? result : -result; //-result is positive!
}
Roztwór ten jest lekko zmodyfikowana my another solution.
prawdopodobnie miałeś na myśli ('std ::') 'string s =" 10 "'. – lijie
Duplikat http://stackoverflow.com/questions/200090/how-do-you-convert-ac-string-to-an-int i http://stackoverflow.com/questions/194465/how-to-parse -a-string-to-an-int-in-c –
@lijie - może, ale nigdy nie mówię tego w moim kodzie ... powinienem być? – kralco626