Как проверить std :: string, если это действительно целое число?

Следующий код преобразует std::string в int и проблема заключается в том, что он не может отличить истинное целое число или просто случайную строку. Существует ли системный метод решения такой проблемы?

#include <cstring>
#include <iostream>
#include <sstream>

int main()
{
std::string str =  "H";

int int_value;
std::istringstream ss(str);
ss >> int_value;

std::cout<<int_value<<std::endl;

return 0;
}

РЕДАКТИРОВАТЬ: Это решение мне понравилось, потому что оно очень минималистично и элегантно! Это не работает для отрицательных чисел, но в любом случае мне нужны были только положительные.

#include <cstring>
#include <iostream>
#include <sstream>

int main()
{
std::string str =  "2147483647";

int int_value;
std::istringstream ss(str);

if (ss >> int_value)
std::cout << "Hooray!" << std::endl;

std::cout<<int_value<<std::endl;str =  "-2147483648";
std::istringstream negative_ss(str);

if (ss >> int_value)
std::cout << "Hooray!" << std::endl;

std::cout<<int_value<<std::endl;

return 0;
}

5

Решение

Подход WhozCraig гораздо приятнее, и я хотел бы расширить его, используя подход, который C ++ FAQ использует что следующим образом:

#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>

class BadConversion : public std::runtime_error {
public:
BadConversion(std::string const& s)
: std::runtime_error(s)
{ }
};inline int convertToInt(std::string const& s,
bool failIfLeftoverChars = true)
{
std::istringstream i(s);
int x;
char c;
if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
throw BadConversion("convertToInt(\"" + s + "\")");
return x;
}int main()
{
std::cout << convertToInt( "100" ) << std::endl ;
std::cout << convertToInt( "-100" ) << std::endl ;
std::cout << convertToInt( "  -100" ) << std::endl ;
std::cout << convertToInt( "  -100  ", false ) << std::endl ;

// The next two will fail
std::cout << convertToInt( "  -100  ", true ) << std::endl ;
std::cout << convertToInt( "H" ) << std::endl ;
}

Это надежно и будет знать, если преобразование не удастся, вы также можете по выбору отказаться на оставшихся символов.

5

Другие решения

Вы можете попробовать использовать Boost lexical_cast, он выдаст исключение, если приведение не выполнено.

int number;
try
{
number = boost::lexical_cast<int>(str);
}
catch(boost::bad_lexical_cast& e)
{
std::cout << str << "isn't an integer number" << std::endl;
}

РЕДАКТИРОВАТЬ
В соответствии с @chris, вы также можете попробовать использовать std::stoi начиная с C ++ 11. Это бросит std::invalid_argument исключение, если преобразование не может быть выполнено. Вы можете найти больше информации здесь: СТД :: стои

7

/* isdigit example */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main ()
{
char str[]="1776ad";
int year;
if (isdigit(str[0]))
{
year = atoi (str);
printf ("The year that followed %d was %d.\n",year,year+1);
}
return 0;
}
1
По вопросам рекламы [email protected]