将字符串转换为 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_tiirc) 您有任何可用的 64 位变量数据类型吗?您得到的数字超过 2010 亿,这对于 32 位整数来说太大了。无符号 32 位整数的最大值为 4,294,967,295。 @peachykeen,你是对的,使用日期/时间结构似乎更有意义。我只是对如何在之后对这些结构进行排序有点困惑.. 【参考方案1】:

您得到负数是因为201212031204 太大而无法容纳int。考虑使用long longs

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

【讨论】:

【参考方案2】:

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

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

完全或者,您也可以使用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 转换为字符串

将字符串转换为整数部分 C++ [关闭]

将字符串的小节转换为 int c++

(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)

c++,stl。将具有 rgb 颜色的字符串转换为 3 个 int 值?