Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menggunakan strtol dengan Betul untuk Menukar Rentetan kepada Integer Panjang dan Mengendalikan Ralat Berpotensi?

Bagaimanakah Saya Boleh Menggunakan strtol dengan Betul untuk Menukar Rentetan kepada Integer Panjang dan Mengendalikan Ralat Berpotensi?

Mary-Kate Olsen
Lepaskan: 2024-12-25 17:31:14
asal
777 orang telah melayarinya

How Can I Correctly Use strtol to Convert Strings to Long Integers and Handle Potential Errors?

Penggunaan strtol yang Betul

Fungsi strtol menukar perwakilan rentetan integer panjang kepada nilai panjang. Walau bagaimanapun, adalah penting untuk memahami cara mengendalikan ralat dengan betul apabila menggunakan fungsi ini.

Dalam kod yang diberikan, masalah timbul disebabkan oleh andaian yang salah. Kod ini bergantung pada fakta bahawa jika strtol berjaya menukar rentetan, parameter kedua harus sama dengan NULL. Walau bagaimanapun, andaian ini mungkin tidak selalunya benar.

Untuk mengesan ralat secara berkesan daripada strtol, adalah perlu mengikut garis panduan pengendalian ralat yang betul:

  • Tetapkan errno kepada 0 sebelum memanggil strtol: Fungsi perpustakaan standard tidak menetapkan errno kepada 0, jadi ia harus ditetapkan secara manual kepada sifar sebelum setiap panggilan strtol.
  • Semak suhu terhadap kedua-dua str dan *temp != ' ': Keadaan ralat berlaku apabila jujukan subjek kosong atau tidak mempunyai bentuk yang diharapkan. Ini ditunjukkan oleh temp == str atau mana-mana aksara yang tidak dikenali selepas jujukan subjek, yang disemak oleh *temp != ' '.
  • Kendalikan nilai di luar julat yang boleh diwakili: Jika nilai yang ditukar berada di luar julat yang boleh diwakili bagi long, strtol mengembalikan LONG_MIN, LONG_MAX, atau menetapkan errno kepada ERANGE. Ini harus disemak untuk memastikan pengendalian yang betul bagi ralat tersebut.

Berikut ialah versi semakan fungsi parseLong yang mematuhi prinsip 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)
{
    errno = 0;
    char *temp;
    *val = strtol(str, &temp, 0);

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

    return true;
}
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); return 0; // or LONG_MIN/LONG_MAX if needed } return val; }

Sebagai alternatif, untuk memisahkan pengendalian ralat daripada hasil penukaran, antara muka yang diubah suai boleh digunakan:

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan strtol dengan Betul untuk Menukar Rentetan kepada Integer Panjang dan Mengendalikan Ralat Berpotensi?. 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