执行strtol后的错误处理

neh*_*ham 3 error-handling errno 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();
}
Run Code Online (Sandbox Code Playgroud)

ISSUE:转换失败后,errno无法更新成功转换案例的错误值.对于之前未成功的通话,它的价值保持不变.

请让我知道如何处理这个问题?

mar*_*iux 5

errno各州的联合会:

errno 任何系统调用或库函数都不会将其设置为零

但您可以将其设置为零,如手册页中所述 strtol()

调用errno之前调用程序应该设置为0,然后通过检查errno调用后是否有非零值来确定是否发生了错误.

所以只需添加

errno = 0;
Run Code Online (Sandbox Code Playgroud)

在打电话之前 strtol()