Проверьте, является ли это целым числом - PullRequest
0 голосов
/ 16 августа 2011

У меня проблема с тем, что я должен прочитать Integers из базы данных.Переменные возвращаются как Strings и могут быть "", "0", "1", "2" или "3" (это те, которые я видел до сих пор).Поэтому использование стандартной функции atoi не помогает, потому что тогда я не могу различить "" и "0".

У кого-нибудь есть хорошее решение, чтобы решить эту проблему?

С уважением, Стефан

РЕДАКТИРОВАТЬ:

"", "0", "1", "2" или "3" не единственные возможности, которые я виделдо сих пор ... Также возможно, что кто-то пишет "Hello World" в поле !!!

Ответы [ 3 ]

3 голосов
/ 16 августа 2011

Используйте stringstream для выполнения преобразования:

int main()
{
    std::stringstream tmp;
    tmp << ""; //This would be the string from the database
    int x;
    if (tmp >> x)
    {
        //We won't get here
        std::cout << x << std::endl;
    }

против:

int main()
{
    std::stringstream tmp;
    tmp << "0";
    int x;
    if (tmp >> x)
    {
        //Will output 0
        std::cout << x << std::endl;
    }

РЕДАКТИРОВАТЬ: Этот код будет обрабатыватьслучай, когда кто-то вводит «Hello World»

1 голос
/ 16 августа 2011

Если производительность является проблемой в вашем случае, я предлагаю следующее:

Решение 1:

std::string input(<your string value>);
int val;
if (sscanf(input.c_str(), "%d", &val) != 1)
{
    cout << "it's empty/not an integer";
}
else
{
    cout << "val is:" << val;
}

Решение 2:

std::string input(<your string value>);
int val;
if(strcmp(input.c_str(), "") ==0)
{
    cout << "it's empty";
}
else
{
    val = atoi(input.c_str());
    cout << "val is:" << val;
}

Я предлагаю использовать первое решение, потому что, если ввод запускает недопустимое содержимое (не целое число), решение atoi завершается неудачно (atoi возвращает 0 при ошибке).

Хотя, еслиу вас значения могут быть только "", "0", "1", "2", "3", второе решение тоже должно работать.

0 голосов
/ 16 августа 2011

Одно условие легко проверить (""), потому что оно будет пустым.

Во-вторых, вы можете удалить кавычки, выполнив что-то вроде

std::string::find( '"' );

вернет std::string::npos, если в строке нет ни двойных кавычек, ни индекса первой.

std::string::erase( pos, npos );

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...