【问题标题】:Convert string to short in C++在 C++ 中将字符串转换为短字符串
【发布时间】:2023-03-28 12:46:01
【问题描述】:

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

要清楚,我指的不是 ASCII 码。

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

我知道我可以使用 while 循环来做到这一点,但如果在 C++ 中有一个内置函数可以做到这一点,它的效率与 while 循环一样或更高,我很想听听。

【问题讨论】:

  • short s; std::istringstream strm("100"); strm >> s; 不工作吗?
  • shorts save memory 我认为这里真正的问题是为什么你认为你需要节省内存?
  • @timrau 哪个更有效,您提出的代码还是词法转换?
  • @user657267 我痴迷于程序效率仅仅是因为我是一个完美主义者。
  • @LarryK 一切都需要权衡,除非您使用具有这些类型的长数组/结构并且缓存来玩。您应该从使用ints 开始,并且仅在分析表明您应该考虑其他内容时才考虑。在编程时,您应该首先考虑您的效率,是否真的值得花时间去关注可能几乎没有影响的问题?

标签: c++ string short


【解决方案1】:

efficient way 是使用boost::lexical_cast

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

您需要安装boost library,包括:#include &lt;boost/lexical_cast.hpp&gt;

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

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

【讨论】:

  • short s; std::istringstream strm("100"); strm &gt;&gt; s;相比,词法转换的效率如何?
  • @LarryK lexical_castabout 20 times faster
【解决方案2】:

基本上,由于未知原因缺少std::stos 函数,但您可以轻松创建自己的函数。使用std::stoi 转换为int,对照short 给出的边界检查值,例如std::numeric_limits&lt;short&gt;,如果不在范围内,则抛出 std::range_error,否则返回该值。在那里。

如果你已经安装了 Boost 库,你可能会使用boost::lexical_cast为了方便,否则我会避免它(主要是因为冗长和库依赖,而且它也有点低效)。

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

【讨论】:

  • 一段示例代码会很有帮助。尤其是使用 while 或 do while 循环来捕获范围错误。
  • @LarryK:我不会为你抓鱼,也不会为你准备。鉴于您希望为您完成它的评论,您非常需要学习钓鱼和准备鱼。最好的办法就是去做。
  • 很好地澄清了词法转换的效率!这是我很着迷的事情。谢谢。
  • @LarryK:嗯。碰巧我对括号里的那句话是错误的:事情已经改变了。因此,我将其标记为已删除并添加了更多最新信息。 ;-)
  • 还有另一个 SO 帖子,他在某处对所有不同的 string-to-int 例程进行基准测试
【解决方案3】:

数字不应超过三或低于零

如果您真的需要节省内存,那么这也适合 char(无论 char 是有符号还是无符号)。

另一个“极端”技巧:如果你可以相信没有像“002”这样的奇怪东西,那么你所拥有的就是一个单一的字符串。如果是这种情况,并且您真的需要性能,请尝试:

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

【讨论】:

    【解决方案4】:

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

    例子:

    short port;
    char szPort[] = "80";
    
    sscanf(szPort, "%hi", &port);
    

    【讨论】:

    • 其实我几周前才知道这些修饰符,但我真的很感谢你的回答!我发现hhh 修饰符非常有用,而不仅仅是ssprintf()
    猜你喜欢
    • 2014-05-20
    • 2013-03-26
    • 1970-01-01
    • 2011-02-03
    • 2015-02-18
    • 1970-01-01
    • 2014-05-02
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多