Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串转换为int失败_C++ - Fatal编程技术网

C++ 将字符串转换为int失败

C++ 将字符串转换为int失败,c++,C++,我正在尝试使用stringstream将字符串转换为int,下面的代码可以工作,但是如果我使用的数字超过了1234567890,比如12345678901,那么它会返回0,我不知道如何解决这个问题,请帮助我 std:: string number= "1234567890"; int Result;//number which will contain the result std::stringstream convert(number.c_str()); // stringstream

我正在尝试使用stringstream将字符串转换为int,下面的代码可以工作,但是如果我使用的数字超过了1234567890,比如12345678901,那么它会返回0,我不知道如何解决这个问题,请帮助我

std:: string number= "1234567890";

int Result;//number which will contain the result

std::stringstream convert(number.c_str()); // stringstream used for the conversion initialized with the contents of Text

if ( !(convert >> Result) )//give the value to Result using the characters in the string
    Result = 0;

printf ("%d\n", Result);

一个int可以包含的最大值略大于20亿。(假设泛素为32位整数)

它就是不适合整数

最大的无符号整数(在32位平台上)是2^32(4294967296),并且您的输入大于该值,因此它放弃了。我猜你可以从中得到一个错误代码。可能检查
failbit
badbit

int Result;
std::stringstream convert(number.c_str());
convert >> Result;
if(convert.fail()) {
    std::cout << "Bad things happened";
}
int结果;
std::stringstream转换(number.c_str());
转换>>结果;
if(convert.fail()){

std::cout如果您使用的是32位或LP64位系统,那么int是32位的,因此可以存储的最大数字约为20亿。请尝试使用long或long-long,并适当地将“%d”更改为“%ld”或“%lld”。

有符号int的(通常)最大值为2.147.483.64732位整数,因此对于较大的数字它失败


如果你用长结果替换int结果;
,它应该适用于更大的数字,但仍然有一个限制。你可以通过使用无符号整数类型将该限制扩大到因子2,但前提是你不需要负数。

Hm,在现有的四个或更多类型中有大量的虚假信息五个答案

int
的最小值为16位,而对于普通桌面系统编译器,它通常为32位(在所有Windows版本中)或64位。对于32位,它的最大值为232个不同的值,设置K=210=1024,则为4·K3,即大约40亿。您最近的计算器或Python提示符可以告诉您确切的值

long
的最小值为32位,但这对解决当前问题没有帮助,因为在所有现有的Windows变体中,包括64位Windows,
long
的最小值为32位

因此,要获得比
int
更好的范围,请使用
long
。它的最小值为64位,实际上,从2012年起,所有编译器的最小值都为64位。或者,只需使用
double
,它虽然不是整数类型,但具有最常见的实现(IEEE 754 64位)可以精确地表示整数值,如我所记得的,大约51或52位–如果需要精确的位数,请查找它


无论如何,请记住检查流的转换失败,您可以通过
s.fail()
或简单地
!s
(这相当于
fail()
,更准确地说,流到
bool
的显式转换返回
!fail()
)。

您不需要
.c_str()
那里。
12345678901
对于
int
来说太大,因此转换失败。提示:尝试
#包含
std::cout我应该使用long还是什么?取决于编译器。有时long是32位(windows!).
long
几乎到处都是64位。@user1552972:除非您告诉我们您的需求是什么,否则您不会得到关于应该做什么的有用答案。(在这种情况下,了解您使用的平台会有帮助。)或者
int64_t
如果您想真正明确。将“%d”更改为“%ld”或“%lld”。您似乎遇到了溢出,这表明您使用的类型不够大。请通过打印sizeof(int)或sizeof(long)检查实际大小。结果是此类型可以存储的字节数。对于输入“1234567890”(大约2^34),您需要至少包含5个字节的类型(通常你只会得到8,因为int之后的下一个更大的东西)OP没有指定Windows,所以虽然很明显平台不是ILP64,但它可能是LP64或LLP64,这意味着
long
是一个可行的答案。此外,OP的代码正在检查失败状态:
if(!(convert>>Result))
@ecatmur:感谢您指出OP代码中的签入。我根本没有仔细查看代码。您正确地识别了我在回答中认为是虚假信息的内容,即使用
long
的建议,因为
long
在最常见的系统(Windows)上仅为32位,是非良好的:如果需要超过32位,请使用保证超过32位的类型,而不是可能有或可能没有更多的类型。