C++ 我的atoi()调用之间有什么区别?

C++ 我的atoi()调用之间有什么区别?,c++,atoi,C++,Atoi,我将一个大数字存储在字符串中,并尝试提取一个数字。但是这些电话之间有什么区别呢 #include <iostream> #include <string> int main(){ std::string bigNumber = "93485720394857230"; char tmp = bigNumber.at(5); int digit = atoi(&tmp); int digit2 = atoi(&a

我将一个大数字存储在字符串中,并尝试提取一个数字。但是这些电话之间有什么区别呢

#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;
}
#包括
#包括
int main(){
std::string bigNumber=“93485720394857230”;
char tmp=bigNumber.at(5);
整数位数=atoi(&tmp);
int-digit2=atoi(&bigNumber.at(5))
int digit3=atoi(&bigNumber.at(12));
std::cout
bigNumber.at()
不会返回包含单个字符的新字符串,而是返回字符串中字符的地址。因此,第二个调用实际上是:

atoi("720394857230")
这会导致内部算法溢出

而且,第一次调用非常危险,因为它取决于
(&tmp)+1处内存中的(随机)值

您必须分配一个包含两个字符的字符串,将
bigNumber.at()
中的单个字符分配给第一个字符,将
\0
分配给第二个字符,然后使用临时字符串的地址调用
atoi()

bigNumber.at()
不会返回包含单个字符的新字符串,而是返回字符串中字符的地址。因此,第二个调用实际上是:

atoi("720394857230")
这会导致内部算法溢出

而且,第一次调用非常危险,因为它取决于
(&tmp)+1处内存中的(随机)值


您必须分配一个包含两个字符的字符串,将
bigNumber.at()
中的单个字符分配给第一个字符,将
\0
分配给第二个字符,然后使用临时字符串的地址调用
atoi()

我知道为什么会显示第二个数字

如果正确的值超出可表示值的范围,则返回INT\u MAX
或INT\u MIN


2147483647是INT_MAX

我知道为什么会显示第二个数字

如果正确的值超出可表示值的范围,则返回INT\u MAX
或INT\u MIN


2147483647为INT_MAX

atoi
的参数应为以零结尾的字符串。

atoi的参数应为以零结尾的字符串。

这或多或少是可以解释的

int main(){
    std::string bigNumber = "93485720394857230";
此行将单个字符“5”复制到字符变量中。
atoi
将正确转换此字符。
atoi
要求字符串参数为有效的以0结尾的字符串。
&tmp
只是指向字符变量的指针-此调用的行为未定义,因为紧跟在t之后的内存内存中的字符未知。确切地说,您必须创建一个以null结尾的字符串并将其传入*

    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词法库。您可以这样使用它:

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)));
chartmp=bigNumber.at(5);
//将字符转换为字符串,然后转换为整数
int digit=boost::词法转换(std::string(tmp));
//这将复制位置5处的整个目标字符串,然后尝试转换
//如果转换失败,则抛出错误的\u词法\u转换
int digit2=boost::lexical_cast(std::string(bigname.at(5));

*严格来说,
atoi
将扫描数字字符,直到找到非数字字符。很明显,它在什么时候会找到一个,以及在读取无效内存位置时会做什么,都没有定义。

这或多或少是可以解释的

int main(){
    std::string bigNumber = "93485720394857230";
此行将单个字符“5”复制到字符变量中<代码>atoi将正确转换此值
atoi
要求字符串参数是有效的以0结尾的字符串
&tmp
只是指向字符变量的指针-此调用的行为未定义,因为内存中紧跟字符之后的内存未知。确切地说,您必须创建一个以null结尾的字符串并将其传入*

    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词法库。您可以这样使用它:

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)));
chartmp=bigNumber.at(5);
//将字符转换为字符串,然后转换为整数
int digit=boost::词法转换(std::string(tmp));
//这将复制位置5处的整个目标字符串,然后尝试转换
//如果转换失败,则抛出错误的\u词法\u转换
int digit2=boost::lexical_cast(std::string(bigname.at(5));

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

函数
at
给出了字符串中字符的指针。函数
atoi
将字符串转换为int,而不仅仅是一个字符。