我有一个std::string
,它可以是一个字符串,也可以是一个值(比如0
)。
将std::string
转换为具有故障能力的int
的最佳或最简单的方法是什么?我想要一个C#的Int32.TryParse
的C++版本。
发布于 2009-08-07 08:10:07
使用streams的其他答案将成功,即使字符串在有效数字后包含无效字符,例如"123abc“。我不熟悉boost,所以不能评论它的行为。
如果您想知道字符串是否包含数字并且只包含数字,则必须使用strtol:
#include <iostream>
#include <string>
int main(void)
{
std::string s;
std::cin >> s;
char *end;
long i = strtol( s.c_str(), &end, 10 );
if ( *end == '\0' )
{
// Success
}
else
{
// Failure
}
}
strtol返回一个指向结束解析的字符的指针,因此可以很容易地检查是否解析了整个字符串。
请注意,strtol返回的是long类型,而不是int类型,但根据编译器的不同,它们可能是相同的。在标准库中没有strtoi函数,只有atoi函数,它不返回解析结束字符。
发布于 2009-08-07 07:34:37
另一种使用标准流的方法:
#include <sstream>
#include <iostream>
#include <string>
int main()
{
std::stringstream convertor;
std::string numberString = "Not a number!";
int number;
convertor << numberString;
convertor >> number;
if(convertor.fail())
{
// numberString is not a number!
std::cout << "Not a Number!";
}
}
发布于 2009-08-07 09:10:26
在boost的lexical_cast
可用之前,我曾经做过以下事情:
namespace detail {
template< typename Target, typename Source >
struct stream_caster {
static Target stream_cast(const Source& s)
{
std::stringstream ss;
if( (ss << s).fail() ) {
throw std::bad_cast("could not stream from source");
}
Target t;
if( (ss >> t).fail() || !(ss >> ws).eof()) {
throw std::bad_cast("could not stream to target");
}
return t;
}
};
template< typename T >
struct stream_caster<T,T> {
static const T& stream_cast(const T& s)
{
return s;
}
};
template< typename Source >
struct stream_caster<std::string,Source> {
static std::string stream_cast(const Source& s)
{
std::ostringstream oss;
if( (oss << s).fail() ) {
throw std::bad_cast("could not stream from source");
}
return oss.str();
}
};
template< typename Target >
struct stream_caster<Target,std::string> {
static Target stream_cast(const std::string& s)
{
std::stringstream ss(s);
Target t;
if( (ss >> t).fail() || !(ss >> ws).eof()) {
throw std::bad_cast("could not stream to target");
}
return t;
}
};
template<>
struct stream_caster<std::string,std::string> {
static const std::string& stream_cast(const std::string& s)
{
return s;
}
};
}
template< typename Target, typename Source >
inline Target stream_cast(const Source& s)
{
return detail::stream_caster<Target,Source>::stream_cast(s);
}
https://stackoverflow.com/questions/1243428
复制相似问题