Я посмотрел везде и не могу найти ответ на этот конкретный вопрос 🙁
У меня есть строковая дата, которая содержит дату со всеми удаленными специальными символами. (то есть: ггггммддчмм или 201212031204).
Я пытаюсь преобразовать эту строку в int, чтобы иметь возможность отсортировать их позже. Я попытался Atoi, не работает, потому что значение слишком высоко для функции. Я пробовал потоки, но всегда возвращает -858993460, и я подозреваю, что это потому, что строка слишком велика. Я попробовал атол и атолл, и они до сих пор не дают правильный ответ.
Я бы предпочел не использовать повышение, так как это для домашней работы, я не думаю, что мне позволят.
У меня нет вариантов для преобразования большой строки в 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
s может содержать до 32 бит или максимальное значение 2147483647 (4294967295, если не подписано). long long
гарантированно будет достаточно большим для номеров, которые вы используете. Если вы оказались в 64-битной системе, long
будет тоже.
Теперь, если вы используете одно из этих больших целых чисел, поток должен конвертироваться правильно. Или, если вы хотите использовать функцию для этого, взгляните на atoll
для long long
или же atol
для long
, (Хотя для лучшей проверки ошибок, вы должны рассмотреть strtoll
или же strtol
.)
В качестве альтернативы, вы также можете использовать time_t
, Они целочисленные типы под капотом, так что вы можете сравнить и отсортировать их. И есть некоторые хорошие функции для них в <ctime>
(посмотри на http://www.cplusplus.com/reference/ctime/).
Вы получаете отрицательные числа, потому что 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 бит.