Преобразование строки в int (C ++)

Я посмотрел везде и не могу найти ответ на этот конкретный вопрос 🙁

У меня есть строковая дата, которая содержит дату со всеми удаленными специальными символами. (то есть: ггггммддчмм или 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;

}

1

Решение

Вы на правильном пути, что значение слишком велико, но это не только для этих функций. Это слишком большой для int в общем. ints может содержать до 32 бит или максимальное значение 2147483647 (4294967295, если не подписано). long long гарантированно будет достаточно большим для номеров, которые вы используете. Если вы оказались в 64-битной системе, long будет тоже.

Теперь, если вы используете одно из этих больших целых чисел, поток должен конвертироваться правильно. Или, если вы хотите использовать функцию для этого, взгляните на atoll для long long или же atol для long, (Хотя для лучшей проверки ошибок, вы должны рассмотреть strtoll или же strtol.)

В качестве альтернативы, вы также можете использовать time_t, Они целочисленные типы под капотом, так что вы можете сравнить и отсортировать их. И есть некоторые хорошие функции для них в <ctime> (посмотри на http://www.cplusplus.com/reference/ctime/).

2

Другие решения

Вы получаете отрицательные числа, потому что 201212031204 слишком большой, чтобы соответствовать int, Рассмотреть возможность использования long longs

Кстати, вы можете сортировать строки.

5

typedef long long S64;

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

Обратите внимание, что, как уже было сказано, числа, с которыми вы работаете, не будут вписываться в 32 бит.

0
По вопросам рекламы [email protected]