我到处寻找,找不到这个具体问题的答案:(
我有一个字符串日期,其中包含剥去所有特殊字符的日期。 (即:yyyymmddhhmm或201212031204)。
我正在尝试将此字符串转换为int,以便稍后对其进行排序。我试过atoi,没用,因为这个函数的值太高了。我尝试过流,但它总是返回-858993460,我怀疑这是因为字符串太大了。我试过atol和环礁,他们仍然没有给出正确的答案。
我宁愿不使用提升,因为这是作业,我不认为我会被允许。
我没有选择将大字符串转换为int吗? 谢谢!
我希望能做什么:
int dateToInt(string date)
{
date = date.substr(6,4) + date.substr(3,2) + date.substr(0,2) + date.substr(11,2) + date.substr(14,2);
int d;
d = atoi(date.c_str());
return d;
}
答案 0 :(得分:5)
您收到负数,因为201212031204
太大而无法容纳int
。考虑使用long long
s
BTW,您也可以对字符串进行排序。
答案 1 :(得分:2)
你在正确的轨道上,价值太大,但它不仅仅适用于那些功能。对于int
来说,它太大了。 int
仅保留最多32位,或最大值2147483647(如果未签名则为4294967295)。 long long
保证足够大,可以使用您正在使用的数字。如果你碰巧在64位系统上,long
也是如此。
现在,如果您使用其中一个较大的整数,则流应该正确转换。或者,如果您想使用函数执行此操作,请查看atoll
的{{1}}或long long
的{{1}}。 (虽然为了更好地进行错误检查,您应该考虑atol
或long
。)
完全或者,您也可以使用strtoll
。它们是引擎盖下的整数类型,因此您可以对它们进行比较和排序。在strtol
中有一些很好的功能(看看http://www.cplusplus.com/reference/ctime/)。
答案 2 :(得分:0)
typedef long long S64;
S64 dateToInt(char * s) {
S64 retval = 0;
while (*s) {
retval = retval * 10 + (*s - '0');
++s;
}
return retval;
}
请注意,如上所述,您使用的数字不适合32位。