3

私はstdin、各行に1つずつ、いくつかの数字を読み込もうとしています。数字と文字列の後の末尾のテキストがあれば無視したい。これを実装するために、私は以下のコードを使用しました:

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が更新されません。失敗した以前の呼び出しの値は同じままです。

この問題の処理方法を教えてください。

4

1 に答える 1

6

状態のマンページerrno:

errnoシステムコールまたはライブラリ関数によってゼロに設定されることはありません

ただし、のマンページに記載されているように、ゼロに設定できますstrtol()

呼び出し元のプログラムは、呼び出しの前に 0 に設定し、呼び出し後に がゼロ以外の値を持っているerrnoかどうかをチェックして、エラーが発生したかどうかを判断する必要があります。errno

だから追加するだけ

errno = 0;

電話する前にstrtol()

于 2013-03-11T20:08:17.407 に答える