所以我一直在寻找如何将字符串转换为short并找到很多关于如何将字符串转换为整数的方法。我会留下一个问题作为对这些主题的评论,但我没有足够的声誉。所以,我想做的是将字符串转换为short,因为数字应该永远不会超过3或者低于零而且short会节省内存(据我所知)。
要清楚,我不是指ASCII码。
我希望能够做的另一件事是检查字符串到short的转换是否失败,因为我将使用一个由用户输入组成的字符串。
我知道我可以使用while循环执行此操作,但如果有一个内置函数在C ++中执行此操作,那将比while循环更有效,我很乐意听到它。< / p>
答案 0 :(得分:12)
基本上,std::stos
功能由于未知原因而丢失,但您可以轻松自行推送。使用std::stoi
转换为int
,根据例如short
边界检查值。 std::numeric_limits<short>
,如果std::range_error
不在范围内,则抛出boost::lexical_cast
,否则返回该值。那里。
如果你已经安装了Boost库,你可以使用boost::lexical_cast
来方便,但是否则我会避免它(主要是为了详细程度和库依赖,和它&# 39; s也有点低效)。
早些时候scanf
因效率不高而闻名,我相信因为它内部基于字符串流,但正如评论中所报道的那样现代版本是faster than conversion via stringstream,并且就此问题而言{{3}} {1}}。
答案 1 :(得分:3)
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
}
答案 2 :(得分:1)
您还可以将ssprintf
与%hi
格式说明符一起使用。
示例:
short port;
char szPort[] = "80";
sscanf(szPort, "%hi", &port);
答案 3 :(得分:0)
该数字不应超过三或零以下
如果确实需要保存内存,那么这也适合char(无论char是有符号还是无符号)。
另一个极端&#39;诀窍:如果你可以相信没有像#34; 002&#34;那你拥有的是一个单字符串。如果是这种情况,并且真的非常需要性能,请尝试:
char result = (char)( *ptr_c_string - '0' );