二进制字符串与'atoi()'整数

Ski*_*NBS 14 c++ binary decimal atoi

我有一个二进制字符串,然后我使用转换为整数atoi().当我这样做时,它似乎自动将二进制转换为十进制.问题是结果整数是负数,并且不符合任何在线二进制到十进制转换器.有什么东西坏了atoi()吗?我应该使用不同的功能吗?

码:

string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;
Run Code Online (Sandbox Code Playgroud)

谢谢

use*_*027 29

atoi不处理二进制数,它只是将它们解释为大十进制数.你的问题是它太高而你得到一个整数溢出,因为它被解释为十进制数.

解决方案是使用stoi,stol或者在C++ 11中stoll添加string.称他们为

int i = std::stoi("01000101", nullptr, 2);
Run Code Online (Sandbox Code Playgroud)
  • 返回的值是转换后的int值.
  • 第一个参数是std::string您要转换的.
  • 第二个是size_t *它将保存第一个非数字字符的索引.
  • 第三个是int对应于将用于转换的基数.

有关函数的信息,请查看其cppreference页面.


请注意,还有一些名称几乎相同的C++ 11函数,例如:strtol与C++ 11相比stol.
它们也可以用于不同的基础,但是它们不会以相同的方式进行错误处理(当没有对给定的字符串进行任何转换时它们尤其缺乏,例如尝试将"hello"转换为字符串)而你应该更喜欢C++ 11版本.

为了说明我的观点,将"Hello"传递给两者strtol和C++ 11 stol会导致:

  • strtol返回0,并没有给你任何方法将其识别为错误,
  • stol从C++ 11抛出std::invalid_argument并表明出现了问题.

错误地将"Hello"这样的内容解释为整数可能会导致错误,在我看来应该避免.

但为了完整起见,还要链接到其cppreference页面.


NPE*_*NPE 6

听起来您应该使用strtol()with2作为最后一个参数。