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

问题描述:

我到处找,找不到回答这个具体问题:(将字符串转换为int(C++)

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

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

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

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

如果您只需要对它们进行排序,请将它们排序为字符串。 – mah

+2

为什么不在日期/时间结构中返回它?没有办法在int中存储那么多数字,所以需要一些更大的数据类型;使用与系统时间函数相同的格式似乎是合适的('date_t' iirc) – ssube

+0

您是否有任何可用的64位可变数据类型?您的结果数量超过了20亿,这对于32位整数来说太大了。无符号32位整数的最大值是4,294,967,295。 –

你说得对,价值太大了,但不仅仅是这些功能。一般来说,这对于int来说太大了。 int只能保持32位,或最大值2147483647(如果无符号,则为4294967295)。 A long long保证足够大的数字,你正在使用。如果你碰巧在64位系统上,long也是。

现在,如果您使用其中一个较大的整数,流应该正确转换。或者,如果您想使用某项功能,请致电atoll查看long longatollong。 (尽管为了更好的错误检查,你应该考虑strtollstrtol。)

完全或者,你也可以使用time_t。它们是引擎盖下的整数类型,因此您可以对它们进行比较和排序。在<ctime>中有一些很好的功能(看看http://www.cplusplus.com/reference/ctime/)。

+0

谢谢,我会研究time_t或制作我自己的时间结构! – XuoriG

+0

也可以在cstdlib中定义compare(void *,void *)并使用sort(a,compare)avalible –

你得到负数,因为201212031204是太大,无法int。考虑使用long long s

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

typedef long long S64; 

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

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

+1

您需要增加s。循环永远不会结束 – Dominick

+0

糟糕。为读者锻炼;-) –