使用'atoi()'将二进制字符串转换为整数

20

我有一个二进制字符串,然后使用 atoi() 将其转换为整数。但当我这样做时,它似乎自动将二进制转换为十进制。问题是,结果整数是负数且与任何在线二进制到十进制转换器都不一致。 atoi() 函数是否有问题?我应该使用其他函数吗?

代码:

string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;

谢谢


你所说的“二进制字符串”是什么意思?像“10001”这样的字符串需要转换为十进制数17吗? - NPE
是的,我刚刚编辑了一下,让它更加清晰明了。 - SkippyNBS
atoi()将输入字符串视为十进制;您可以使用strtol()(或其相关函数之一),并将基数设置为2以获取二进制。 - Jonathan Leffler
1
@JonathanLeffler 我认为现在应该使用stol(如果您有C++11可用),它具有更好的错误处理能力。例如,将类似“hello”的内容传递给strtol会返回0,而将其传递给C++11的stol会抛出std::invalid_argument异常。将“Hello”解释为0可能会导致许多错误。 - AliciaBytes
1
好的。strtol() 报告错误的方式比较迂回,如果你在意错误检测,就不应该直接调用它。你可以将其包装在一个函数中,以便检测你关心的错误并以适当的方式报告它们。如果你不太关心错误处理,也可以使用它。GIGO(垃圾进,垃圾出)仍然有效;如果 GO 部分不会造成太大的损害,那么你可能不需要检测 GI 部分。strtol() 的一个优点是它来自 C 语言,并且始终可用 - 它不依赖于 C++11。这是否重要取决于上下文。 - Jonathan Leffler
2个回答

49

atoi无法处理二进制数,它会将其解释为十进制数。你的问题是太大了,因为它被解释为十进制数而导致整数溢出。

解决方法是使用在C ++11中添加到stringstoistolstoll。调用它们的方式如下:

int i = std::stoi("01000101", nullptr, 2);
  • 返回值是转换后的 int 值。
  • 第一个参数是要转换的 std::string
  • 第二个参数是一个 size_t * 类型,它将保存第一个非数字字符的索引。
  • 第三个参数是一个整数,表示要使用的转换进制。

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


请注意,还存在 C++11 之前的几乎同名函数,例如: strtol 与 C++11 的 stol
它们也可以用于不同的进制,但是它们的错误处理方式不同(特别是缺少无法将给定字符串完全转换为数字时的处理,例如尝试将“hello”转换为数字),因此您应该优先考虑使用 C++11 版本

举个例子,对两个函数都传递 "Hello":

  • strtol 返回 0,并没有任何方法可以将其标识为错误,
  • C++11 的 stol 抛出 std::invalid_argument 并指示出现问题。

错误地将类似 "Hello" 的字符串解释为整数可能导致错误,应该尽量避免。

但为了完整起见,也提供一个链接到cppreference 页面


6

看起来你应该使用strtol(),并将2作为最后一个参数。


既然这是被接受的答案,我想要补充一下,我认为在处理错误时,C++11版本的字符串转整数功能更加优秀(而且不应该使用strtol)。更多信息请查看我的回答底部。 - AliciaBytes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接