将字符串转换为 int (C++)
Posted
技术标签:
【中文标题】将字符串转换为 int (C++)【英文标题】:Converting string to int (C++) 【发布时间】:2012-12-03 17:11:11 【问题描述】:我到处找,找不到这个特定问题的答案:(
我有一个字符串日期,其中包含删除了所有特殊字符的日期。 (即: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;
【问题讨论】:
如果您只需要对它们进行排序,请将它们排序为字符串。 为什么不在日期/时间结构中返回呢?没有办法在 int 中存储这么多数字,因此需要一些更大的数据类型;使用与系统时间函数相同的形式似乎是合适的 (date_t
iirc)
您有任何可用的 64 位变量数据类型吗?您得到的数字超过 2010 亿,这对于 32 位整数来说太大了。无符号 32 位整数的最大值为 4,294,967,295。
@peachykeen,你是对的,使用日期/时间结构似乎更有意义。我只是对如何在之后对这些结构进行排序有点困惑..
【参考方案1】:
您得到负数是因为201212031204
太大而无法容纳int
。考虑使用long long
s
顺便说一句,您也可以对字符串进行排序。
【讨论】:
【参考方案2】:您在正确的轨道上,该值太大,但不仅仅是这些功能。一般来说,它对于int
来说太大了。 int
s 最多只能保存 32 位,或最大值 2147483647(如果无符号则为 4294967295)。 long long
保证对于您使用的数字足够大。如果你碰巧在 64 位系统上,long
也可以。
现在,如果您使用这些较大的整数之一,流应该可以正确转换。或者,如果您想使用函数来执行此操作,请查看 atoll
以获取 long long
或 atol
以获取 long
。 (虽然为了更好的错误检查,你真的应该考虑strtoll
或strtol
。)
完全或者,您也可以使用time_t
。它们是底层的整数类型,因此您可以对它们进行比较和排序。在<ctime>
中为它们提供了一些不错的功能(看看http://www.cplusplus.com/reference/ctime/)。
【讨论】:
您还可以定义 compare(void ,void) 并使用 cstdlib 中可用的 sort(a,compare)【参考方案3】:typedef long long S64;
S64 dateToInt(char * s)
S64 retval = 0;
while (*s)
retval = retval * 10 + (*s - '0');
++s;
return retval;
请注意,如前所述,您使用的数字不适合 32 位。
【讨论】:
你需要增加 s。循环永远不会结束以上是关于将字符串转换为 int (C++)的主要内容,如果未能解决你的问题,请参考以下文章
c++ 不使用 C 标准库将字符串和 int 转换为 char*
使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串