我有存储在一个串一个大数字,并尝试提取一个单一的数字。 但什么是呼叫之间的区别是什么?
#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;
这都或多或少地得到解释。
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
将通过数字字符,直到一个非数字已找到一个扫描。 这显然是不确定的时候会发现一个与阅读过无效的内存位置时,它会做什么。
我知道为什么显示的第2个数字。
从参考的atoi。
如果正确的值超出表示的值的范围, INT_MAX
退回或INT_MIN。
2147483647是INT_MAX
bigNumber.at()
不使用单个字符,但字符串中的字符的地址返回一个新的字符串。 所以第二个电话居然是:
atoi("720394857230")
这会导致内部算法溢出。
此外,第一个电话是非常危险的,因为它依赖于内存的(随机)值(&tmp)+1
。
你必须分配一个字符串两个字符,分配来自单个字符bigNumber.at()
到第一和\0
到第二,然后调用atoi()
与临时字符串的地址。
功能at
给指针的字符串中的字符。 功能atoi
转换字符串为int,不仅是一个字符。