std :: string часть в целое число - PullRequest
5 голосов
/ 18 января 2011

У меня есть std :: string: 01001, я хочу получить каждое число:

std::string foo = "01001";
for (int i=0; i < foo.size(); ++i)
{
   int res = atoi( foo[i] );  // fail
   int res = atoi( &foo[i] ); // ok, but res = 0 in any case
}

Как это сделать?

Ответы [ 4 ]

10 голосов
/ 18 января 2011

Это самый простой способ, которым я вижу:

std::string foo = "01001";
for (int i=0; i < foo.size(); ++i)
{
   int res = foo[i] - '0';
}
6 голосов
/ 18 января 2011

Если вы знаете, что все символы foo являются цифрами, вы можете использовать (int) (foo[i] - '0'), который вычитает значение ascii '0' из символа. Это работает для всех цифр, потому что их значения ASCII являются последовательными.

Ваша первая попытка не удалась, потому что foo[i] - это один char, а atoi() принимает строку. Ваша вторая попытка не удалась, потому что &foo[i] является ссылкой на этот символ.

3 голосов
/ 18 января 2011

Каждую цифру можно получить, просто используя вычитание:

int res = foo[i] - '0';

atoi принимает строку с нулевым символом в конце, а не отдельный символ. Подход вычитания работает, потому что десять десятичных цифр гарантированно будут последовательными в наборе символов (очевидно, если есть вероятность, что в строке будут нецифровые символы, вы захотите выполнить надлежащую обработку ошибок). *

0 голосов
/ 18 января 2011

Один простой способ, очень близкий к тому, что у вас есть, - вставить символ в предопределенную строку, например:

std::string foo = "01001";
char str[] = {" "};
for (int i=0; i < foo.size(); ++i)
{
   str[0] = foo[i];
   int res = atoi( str );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...