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