-->

什么是我的atoi()调用之间的区别?(What is difference between my

2019-10-16 14:46发布

我有存储在一个串一个大数字,并尝试提取一个单一的数字。 但什么是呼叫之间的区别是什么?

#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;
}

这将产生以下输出。

数字:7

digit2:2147483647

digit3:57230

第一个是所期望的结果。 第二个对我来说似乎是一个随机数,我不能在字符串中找到。 第三个是字符串的结尾,但不只是我想象的一个数字,但最多从12指数的字符串的结尾。 有人可以解释不同的输出给我吗?

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

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

Answer 1:

这都或多或少地得到解释。

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

这条线份的单个字符“5”到字符变量。 atoi将正确地转换这一点。 atoi期望字符串参数是有效的0结束的字符串。 &tmp只是一个指针字符变量-此调用的行为是不确定的,因为马上在内存中的字符后的内存是未知的。 确切的说,你必须创建一个空结束的字符串,并通过在*。

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

这条线得到一个指向字符的字符串中的位置5。 这恰好是一个指针到原来的大串号以上-这样的字符串参数atoi看起来像字符串“5720394857230”。 atoi将明确oveflow试图变成一个整数,这个因为没有32位整数将保持这个。

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

此行得到一个指针存入字符串在位置12所述的参数atoi是字符串“57230”。 此被转换成整数57230正确。

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

...}

由于使用的是C ++,有更好的方法来字符的字符串转换为整数。 一说我偏是图书馆的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将通过数字字符,直到一个非数字已找到一个扫描。 这显然是不确定的时候会发现一个与阅读过无效的内存位置时,它会做什么。



Answer 2:

我知道为什么显示的第2个数字。

从参考的atoi。

如果正确的值超出表示的值的范围, INT_MAX退回或INT_MIN。

2147483647是INT_MAX



Answer 3:

bigNumber.at()不使用单个字符,但字符串中的字符的地址返回一个新的字符串。 所以第二个电话居然是:

atoi("720394857230")

这会导致内部算法溢出。

此外,第一个电话是非常危险的,因为它依赖于内存的(随机)值(&tmp)+1

你必须分配一个字符串两个字符,分配来自单个字符bigNumber.at()到第一和\0到第二,然后调用atoi()与临时字符串的地址。



Answer 4:

给个说法atoi应该是一个0结尾的字符串。



Answer 5:

功能at给指针的字符串中的字符。 功能atoi转换字符串为int,不仅是一个字符。



文章来源: What is difference between my atoi() calls?
标签: c++ atoi