首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中使用bool/fail将字符串转换为整型

在C++中使用bool/fail将字符串转换为整型
EN

Stack Overflow用户
提问于 2009-08-07 07:27:41
回答 3查看 19.6K关注 0票数 22

我有一个std::string,它可以是一个字符串,也可以是一个值(比如0)。

std::string转换为具有故障能力的int的最佳或最简单的方法是什么?我想要一个C#的Int32.TryParse的C++版本。

EN

回答 3

Stack Overflow用户

发布于 2009-08-07 08:10:07

使用streams的其他答案将成功,即使字符串在有效数字后包含无效字符,例如"123abc“。我不熟悉boost,所以不能评论它的行为。

如果您想知道字符串是否包含数字并且只包含数字,则必须使用strtol:

代码语言:javascript
复制
#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函数,它不返回解析结束字符。

票数 9
EN

Stack Overflow用户

发布于 2009-08-07 07:34:37

另一种使用标准流的方法:

代码语言:javascript
复制
#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!";
    }
}
票数 8
EN

Stack Overflow用户

发布于 2009-08-07 09:10:26

在boost的lexical_cast可用之前,我曾经做过以下事情:

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1243428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档