gpt4 book ai didi

c++ - 我的 atoi() 调用有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:06:26 25 4
gpt4 key购买 nike

我有一个很大的数字存储在一个字符串中,并尝试提取一个数字。但是这些调用之间有什么区别?

#include <iostream>
#include <string>

int main(){
std::string bigNumber = "93485720394857230";
char tmp = bigNumber.at(5);
int digit = atoi(&tmp);
int digit2 = atoi(&bigNumber.at(5))
int digit3 = atoi(&bigNumber.at(12));
std::cout << "digit: " << digit << std::endl;
std::cout << "digit2: " << digit2 << std::endl;
std::cout << "digit3: " << digit3 << std::endl;
}

这将产生以下输出。

digit: 7

digit2: 2147483647

digit3: 57230

第一个是想要的结果。第二个在我看来是一个随机数,我在字符串中找不到。第三个是字符串的末尾,但不是像我预期的那样只是一个数字,而是从第 12 个索引到字符串的末尾。有人可以向我解释不同的输出吗?

编辑:这是一个可以接受的解决方案吗?

char tmp[2] = {bigNumber.at(5), '\0'};
int digit = atoi(tmp);
std::cout << "digit: " << digit << std::endl;

最佳答案

这或多或少都是可以解释的。

int main(){
std::string bigNumber = "93485720394857230";

此行将单个字符“5”复制到字符变量中。 atoi 将正确转换它。 atoi 期望字符串参数是有效的 0 终止字符串。 &tmp 只是指向字符变量的指针 - 此调用的行为是未定义的,因为内存中紧跟字符的内存是未知的。确切地说,您必须创建一个空终止字符串并将其传入。*

    char tmp = bigNumber.at(5);
int digit = atoi(&tmp);

此行获取指向字符串中位置 5 的字符的指针。这恰好是指向上面原始大数字字符串的指针 - 因此 atoi 的字符串参数看起来像字符串“5720394857230”。 atoi 显然会溢出,试图将其转换为整数,因为没有 32 位整数可以保存它。

    int digit2 = atoi(&bigNumber.at(5))

此行在位置 12 处获取指向字符串的指针。atoi 的参数是字符串“57230”。正确转换为整数 57230。

    int digit3 = atoi(&bigNumber.at(12));

...

由于您使用的是 C++,因此有更好的方法可以将字符串转换为整数。我偏爱的一个是 Boost lexical_cast 库。你会像这样使用它:

char tmp = bigNumber.at(5);
// convert the character to a string then to an integer
int digit = boost::lexical_cast<int>(std::string(tmp));

// this copies the whole target string at position 5 and then attempts conversion
// if the conversion fails, then a bad_lexical_cast is thrown
int digit2=boost::lexical_cast<int>(std::string(bigNumber.at(5)));

* 严格来说,atoi 将扫描数字字符,直到找到非数字字符。它何时会找到一个以及在读取无效内存位置时会做什么显然是未定义的。

关于c++ - 我的 atoi() 调用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1026190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com