将 ASCII 字符串转换为 long long

发布于 2024-12-04 01:54:16 字数 96 浏览 1 评论 0原文

我从 C++ 数据文件中获得了一些信息行。一项信息是 12 个字符长的数字。如何将其从字符串转换为 long long (我认为 long long 最适合此操作)而不丢失数据?

I've got some lines of information from a data-file in C++. One information is a 12 character long number. How can I convert this from string to long long (I think long long is most suitable for this) without data loss?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒猫 2024-12-11 01:54:16

在 C++ 中,没有 long long 数据类型。 它在 C99 中可用。但是,您可以使用 int64_t。包含

使用 boost::lexical_cast 将字符串转换为 int64_t

或者您可以自己编写一个转换函数:

int64_t convert(const std::string &s)
{
   if(s.size() == 0 ) 
       std::runtime_error error("invalid argument");
   int64_t v = 0;
   size_t i=0;
   char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+';
   for( ; i < s.size(); ++i)
   {
      if ( s[i] < '0' || s[i] > '9' )
          throw std::runtime_error("invalid argument");
      v = v * 10 + s[i] - '0';
   }
   return sign == '-' ? -v : v;
}

测试代码:

int main() {
        try{
           std::cout << convert("68768768") << std::endl;
           std::cout << convert("+68768768") << std::endl;
           std::cout << convert("-68768768") << std::endl;
           std::cout << convert("68768768x") << std::endl;
        }catch(const std::exception &e)
        {
           std::cout << e.what() << std::endl;
        }
        return 0;
}

输出:

68768768
68768768
-68768768
invalid argument

在线演示: http://ideone.com/nnSLp

In C++, there is no long long data type. It's available in C99. However, you can use int64_t. Include <stdint.h>.

Use boost::lexical_cast to convert string into int64_t.

Or you can write a convert function yourself as:

int64_t convert(const std::string &s)
{
   if(s.size() == 0 ) 
       std::runtime_error error("invalid argument");
   int64_t v = 0;
   size_t i=0;
   char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+';
   for( ; i < s.size(); ++i)
   {
      if ( s[i] < '0' || s[i] > '9' )
          throw std::runtime_error("invalid argument");
      v = v * 10 + s[i] - '0';
   }
   return sign == '-' ? -v : v;
}

Test code:

int main() {
        try{
           std::cout << convert("68768768") << std::endl;
           std::cout << convert("+68768768") << std::endl;
           std::cout << convert("-68768768") << std::endl;
           std::cout << convert("68768768x") << std::endl;
        }catch(const std::exception &e)
        {
           std::cout << e.what() << std::endl;
        }
        return 0;
}

Output:

68768768
68768768
-68768768
invalid argument

Online demo : http://ideone.com/nnSLp

满栀 2024-12-11 01:54:16

64 位整数足以表示任何 12 位十进制数(还有足够的空间)。因此,根据您的平台,long 可能就足够了。如果是这种情况,您可以使用 strtolstrtoul

如果您确实发现需要 long long,请查看 strtollstrtoull

A 64-bit bit integer is enough to represent any 12-digit decimal number (with plenty of room to spare). Thus, depending on your platform, it could be that a long will suffice. If that's the case, you could use strtol or strtoul.

If you do find that you need a long long, take a look at strtoll and strtoull.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文