我有一个二进制字符串,然后使用 atoi()
将其转换为整数。但当我这样做时,它似乎自动将二进制转换为十进制。问题是,结果整数是负数且与任何在线二进制到十进制转换器都不一致。 atoi()
函数是否有问题?我应该使用其他函数吗?
代码:
string myString = "01000101";
int x = atoi(myString.c_str());
cout << x;
谢谢
atoi
无法处理二进制数,它会将其解释为十进制数。你的问题是太大了,因为它被解释为十进制数而导致整数溢出。
解决方法是使用在C ++11中添加到string
的stoi
,stol
或stoll
。调用它们的方式如下:
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
,并没有任何方法可以将其标识为错误,stol
抛出 std::invalid_argument
并指示出现问题。错误地将类似 "Hello" 的字符串解释为整数可能导致错误,应该尽量避免。
但为了完整起见,也提供一个链接到cppreference 页面。
看起来你应该使用strtol()
,并将2
作为最后一个参数。
strtol
)。更多信息请查看我的回答底部。 - AliciaBytes
atoi()
将输入字符串视为十进制;您可以使用strtol()
(或其相关函数之一),并将基数设置为2
以获取二进制。 - Jonathan Lefflerstol
(如果您有C++11可用),它具有更好的错误处理能力。例如,将类似“hello”的内容传递给strtol
会返回0
,而将其传递给C++11的stol
会抛出std::invalid_argument
异常。将“Hello”解释为0
可能会导致许多错误。 - AliciaBytesstrtol()
报告错误的方式比较迂回,如果你在意错误检测,就不应该直接调用它。你可以将其包装在一个函数中,以便检测你关心的错误并以适当的方式报告它们。如果你不太关心错误处理,也可以使用它。GIGO(垃圾进,垃圾出)仍然有效;如果 GO 部分不会造成太大的损害,那么你可能不需要检测 GI 部分。strtol()
的一个优点是它来自 C 语言,并且始终可用 - 它不依赖于 C++11。这是否重要取决于上下文。 - Jonathan Leffler