在 C++ 中将字符串转换为短字符串

Convert string to short in C++

所以我四处寻找如何将字符串转换为短整型,并找到了很多关于如何将字符串转换为整数的信息。我会留下一个问题作为对这些线程的评论,但我没有足够的声誉。所以,我想做的是将一个字符串转换为一个短字符串,因为数字永远不会超过三或低于零,并且短裤可以节省内存(据我所知)。

需要说明的是,我指的不是 ASCII 码。

我想做的另一件事是检查字符串到短字符串的转换是否失败,因为我将使用由用户输入组成的字符串。

我知道我可以用 while 循环来做到这一点,但是如果在 C++ 中有一个内置函数可以比 while 循环更有效,或者更有效,我很想听听它.

一个efficient way就是用boost::lexical_cast:

short myShort = boost::lexical_cast<short>(myString);

您将需要安装 boost library 并且以下内容包括:#include <boost/lexical_cast.hpp>

你应该抓住 bad_lexical_cast 以防转换失败:

    try
    {
        short myShort = boost::lexical_cast<short>(myString);
    }
    catch(bad_lexical_cast &)
    {
        // Do something
    }

基本上,由于未知原因缺少 std::stos 功能,但您可以轻松地自己动手。使用 std::stoi 转换为 int,根据 short 给出的边界检查值std::numeric_limits<short>,如果不在范围内则抛出 std::range_error,否则抛出 return 那个值。那里。

如果您已经安装了 Boost 库,您可以使用 boost::lexical_cast 为了方便 ,但我会避免使用它(主要是为了冗长和库依赖性,而且效率也有点低).

早期的 boost::lexical_cast 以效率不高而著称,我相信是因为它在内部基于字符串流,但正如此处评论中所报告的那样,现代版本是 faster than conversion via stringstream,就此而言通过 scanf.

the number should never go above three or below zero

如果你真的需要节省内存,那么这也适合一个字符(不管字符是有符号还是无符号)。

另一个 'extreme' 技巧:如果您可以相信没有像“002”这样奇怪的东西,那么您拥有的只是一个字符串。如果是这样,并且您真的 需要性能,请尝试:

char result = (char)( *ptr_c_string - '0' );

您还可以将 ssprintf%hi 格式说明符一起使用。

示例:

short port;
char szPort[] = "80";

sscanf(szPort, "%hi", &port);