Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengendalikan Ralat Dengan Betul Apabila Menggunakan Fungsi `strtol` C?

Bagaimanakah Saya Boleh Mengendalikan Ralat Dengan Betul Apabila Menggunakan Fungsi `strtol` C?

Susan Sarandon
Susan Sarandonasal
2024-12-18 14:57:10193semak imbas

How Can I Properly Handle Errors When Using C's `strtol` Function?

Pengendalian Ralat yang Betul untuk Fungsi strtol C

Pengesanan Ralat dalam strtol

Dalam program C yang diberikan, penggunaan strtol kelihatan seperti ia menggunakan fakta bahawa penukaran rentetan ke panjang yang berjaya harus meninggalkan parameter kedua (endptr) sama dengan NULL untuk menentukan ralat. Walau bagaimanapun, mesej ralat yang dipaparkan menunjukkan bahawa ini tidak selalu berlaku.

Metodologi Pengendalian Ralat yang Betul

Pendekatan yang betul untuk pengesanan ralat dalam strtol melibatkan beberapa langkah:

1. Tetapkan errno kepada 0: Fungsi perpustakaan C standard tidak menetapkan errno kepada 0, jadi melakukannya secara manual sebelum memanggil strtol memastikan bahawa sebarang ralat yang dihadapi akan ditunjukkan dalam errno.

2. Semak Keputusan Penukaran: Jika strtol mengembalikan 0 atau LONG_MIN/LONG_MAX dengan errno ditetapkan kepada ERANGE, ini menunjukkan ralat dalam penukaran atau nilai di luar julat.

3. Bezakan Jenis Ralat: Dalam sesetengah kes, anda mungkin perlu membezakan antara jenis ralat tertentu, seperti sarap tertinggal atau format angka yang tidak sah. Ini boleh dicapai dengan menyemak kedudukan endptr dan nilai ralat dalam errno.

Pelaksanaan Fungsi Disemak

Berikut ialah versi semakan fungsi parseLong:

static long parseLong(const char *str)
{
    char *temp;
    errno = 0;  // Reset errno
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '' ||
        ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE))
    {
        fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n",
                str, temp);
        return 0;  // Handle errors by returning a specific value like 0
    }

    return val;
}

Fungsi ini mengembalikan 0 sekiranya berlaku ralat, sambil mengembalikan nilai yang ditukar jika berjaya.

Kesimpulan

Pendapat utama daripada analisis ralat ini adalah dengan menggunakan pendekatan pengendalian ralat menyeluruh yang melibatkan penetapan errno, menyemak hasil penukaran dan membezakan jenis ralat. Ini memastikan kod yang mantap dan boleh dipercayai apabila bekerja dengan penukaran rentetan kepada angka.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Ralat Dengan Betul Apabila Menggunakan Fungsi `strtol` C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn