2013-03-11 4 views
2

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

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 не обновляется со значением ошибки для успешного случая преобразования. Это значение остается неизменным для предыдущих вызовов, которые не увенчались успехом.

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

ответ

3

страница руководство из errno состояний:

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

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

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

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

errno = 0; 

strtol() перед вызовом

+0

спасибо за разъяснения ... он работал – neham