将字符串转换为int(C ++)

时间:2012-12-03 17:11:11

标签: c++ string int atoi

我到处寻找,找不到这个具体问题的答案:(

我有一个字符串日期,其中包含剥去所有特殊字符的日期。 (即: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;

}

3 个答案:

答案 0 :(得分:5)

您收到负数,因为201212031204太大而无法容纳int。考虑使用long long s

BTW,您也可以对字符串进行排序。

答案 1 :(得分:2)

你在正确的轨道上,价值太大,但它不仅仅适用于那些功能。对于int来说,它太大了。 int仅保留最多32位,或最大值2147483647(如果未签名则为4294967295)。 long long保证足够大,可以使用您正在使用的数字。如果你碰巧在64位系统上,long也是如此。

现在,如果您使用其中一个较大的整数,则流应该正确转换。或者,如果您想使用函数执行此操作,请查看atoll的{​​{1}}或long long的{​​{1}}。 (虽然为了更好地进行错误检查,您应该考虑atollong。)

完全或者,您也可以使用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位。