1

我到处找,找不到这个特定问题的答案:(

我有一个字符串日期,其中包含删除所有特殊字符的日期。(即:yyyymmddhhmm 或 201212031204)。

我正在尝试将此字符串转换为 int 以便稍后对其进行排序。我尝试了atoi,没有工作,因为该功能的价值太高了。我尝试了流,但它总是返回 -858993460,我怀疑这是因为字符串太大了。我尝试了 atol 和 atoll ,但他们仍然没有给出正确的答案。

我宁愿不使用 boost,因为这是作业,我不认为我会被允许。

我没有将大字符串转换为 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;

}
4

3 回答 3

5

你得到负数 201212031204是因为太大而无法适应int。考虑使用long longs

顺便说一句,您也可以对字符串进行排序。

于 2012-12-03T17:13:47.090 回答
2

你在正确的轨道上,价值太大,但不仅仅是那些功能。它对于一般来说太大了intints 最多只能保存 32 位,或最大值 2147483647(如果无符号则为 4294967295)。Along long保证对于您使用的数字足够大。如果您碰巧在 64 位系统上,along也将如此。

现在,如果您使用这些较大的整数之一,则流应该可以正确转换。或者,如果您想使用函数来执行此操作,请查看atollfor along longatolfor a long。(虽然为了更好的错误检查,你真的应该考虑strtollor strtol。)

完全或者,您也可以使用time_t. 它们是底层的整数类型,因此您可以对它们进行比较和排序。并且有一些不错的功能<ctime>(请查看http://www.cplusplus.com/reference/ctime/)。

于 2012-12-03T17:22:41.533 回答
0
typedef long long S64;

S64 dateToInt(char * s) {
    S64 retval = 0;
    while (*s) {
         retval = retval * 10 + (*s - '0');
         ++s;
    }
    return retval;
}

请注意,如前所述,您使用的数字不适合 32 位。

于 2012-12-03T21:17:26.233 回答