Обработка ошибок после выполнения strtol

Я пытаюсь прочитать несколько чисел на stdin, по одному числу в каждой строке. Я хочу игнорировать любой завершающий текст после числа и строк, если они есть в любой строке. Для реализации этого я использовал следующий код:

while (getline(cin, str)) {
    num = strtol(str.c_str(), NULL, 0);

    if (errno != ERANGE && errno != EINVAL) {
        arr[i++] = num;
        req_pages_size++;
        cout << arr[i-1] << "\t";
    }

    str.clear();
}

ПРОБЛЕМА: после неудачного преобразования errno не обновляется значением ошибки для случая успешного преобразования. Это значение остается прежним для предыдущих вызовов, которые не увенчались успехом.

Подскажите, пожалуйста, как справиться с этой проблемой?


person neham    schedule 11.03.2013    source источник


Ответы (1)


На странице руководства errno указано:

errno никогда не обнуляется никаким системным вызовом или библиотечной функцией.

но вы можете установить его равным нулю, как указано на странице руководства strtol()

вызывающая программа должна установить errno в 0 перед вызовом, а затем определить, произошла ли ошибка, проверив, имеет ли errno ненулевое значение после вызова.

так что просто добавь

errno = 0;

до звонка strtol()

person mariux    schedule 11.03.2013