将字符串转换为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;
}
你说得对,价值太大了,但不仅仅是这些功能。一般来说,这对于int
来说太大了。 int
只能保持32位,或最大值2147483647(如果无符号,则为4294967295)。 A long long
保证足够大的数字,你正在使用。如果你碰巧在64位系统上,long
也是。
现在,如果您使用其中一个较大的整数,流应该正确转换。或者,如果您想使用某项功能,请致电atoll
查看long long
或atol
的long
。 (尽管为了更好的错误检查,你应该考虑strtoll
或strtol
。)
完全或者,你也可以使用time_t
。它们是引擎盖下的整数类型,因此您可以对它们进行比较和排序。在<ctime>
中有一些很好的功能(看看http://www.cplusplus.com/reference/ctime/)。
谢谢,我会研究time_t或制作我自己的时间结构! – XuoriG
也可以在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位。
您需要增加s。循环永远不会结束 – Dominick
糟糕。为读者锻炼;-) –
如果您只需要对它们进行排序,请将它们排序为字符串。 – mah
为什么不在日期/时间结构中返回它?没有办法在int中存储那么多数字,所以需要一些更大的数据类型;使用与系统时间函数相同的格式似乎是合适的('date_t' iirc) – ssube
您是否有任何可用的64位可变数据类型?您的结果数量超过了20亿,这对于32位整数来说太大了。无符号32位整数的最大值是4,294,967,295。 –