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

Bagaimanakah Saya Boleh Mengendalikan Ralat Dengan Betul Apabila Menggunakan strtol dalam C dan C?

Barbara Streisand
Lepaskan: 2024-12-25 15:35:09
asal
866 orang telah melayarinya

How Can I Properly Handle Errors When Using strtol in C and C  ?

Penggunaan strtol yang Betul dengan Pengendalian Ralat

Aturcara C atau C berikut menukar rentetan kepada integer panjang, bergantung pada fakta bahawa strtol kembali NULL untuk penukaran yang berjaya. Walau bagaimanapun, apabila diberi nilai 55, ia gagal dengan mesej berikut:

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
Salin selepas log masuk

Artikel ini meneroka cara mengesan ralat dalam strtol dengan betul dan menangani isu dalam program yang diberikan.

Pengendalian Ralat dalam strtol

Spesifikasi rasmi untuk strtol (dan fungsi berkaitan seperti strtoll) menyatakan bahawa:

  • Ia membahagikan rentetan input kepada tiga bahagian: ruang putih, subjek (integer) dan aksara tidak dikenali.
  • Jika subjek kosong atau tidak sah, tiada penukaran berlaku dan endptr menunjuk ke permulaan rentetan input.
  • Jika nilai yang ditukar berada di luar julat yang boleh diwakili, ia mengembalikan nilai minimum atau maksimum yang sesuai (cth., LONG_MIN atau LONG_MAX), dan errno ditetapkan kepada ERANGE.

Membetulkan Program

Dalam C, ralat daripada strtol boleh dikesan dengan menetapkan errno kepada sifar sebelum memanggil fungsi tersebut. Fungsi parseLong yang diubah suai di bawah mengikut pendekatan ini:

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

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE))
        rc = false;

    return rc;
}
Salin selepas log masuk
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • Jika input kosong, tidak sah atau mempunyai aksara mengekor, ia mencetak ralat kepada stderr dan mengembalikan 0 atau LONG_MIN/LONG_MAX jika ralat disebabkan limpahan julat.
  • Jika tiada ralat, ia mengembalikan yang ditukar nilai.

Dalam C , pendekatan yang lebih fleksibel ialah mengembalikan penunjuk kejayaan/kegagalan dan menyediakan fungsi berasingan untuk mengekstrak nilai yang ditukar:

Kesimpulan

Dengan pengubahsuaian ini, fungsi parseLong dengan betul mengendalikan ralat daripada strtol, membenarkan aplikasi untuk menentukan kejayaan atau kegagalan penukaran dan mengendalikan ralat dengan sewajarnya.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan