Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengesan Ralat dengan Amanah Semasa Menukar Rentetan kepada Integer Panjang Menggunakan strtol dalam C?

Bagaimanakah Saya Boleh Mengesan Ralat dengan Amanah Semasa Menukar Rentetan kepada Integer Panjang Menggunakan strtol dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-12-14 20:36:16558semak imbas

How Can I Reliably Detect Errors When Converting Strings to Long Integers Using strtol in C?

Mengesan Ralat dalam Penukaran Rentetan ke Panjang Menggunakan strtol

Dalam pengaturcaraan C, fungsi strtol biasanya digunakan untuk menukar perwakilan rentetan sesuatu integer panjang kepada nilai berangkanya. Walau bagaimanapun, menggunakan strtol sahaja mungkin tidak selalu memberikan pengendalian ralat yang mencukupi.

Masalah:

Kod yang disediakan menunjukkan senario di mana atur cara menukar rentetan kepada integer panjang dengan betul , tetapi juga mencetak mesej ralat yang menyatakan "Tidak dapat menukar" walaupun penukaran berjaya. Ini kerana atur cara mengandaikan bahawa jika strtol berjaya menukar rentetan, parameter kedua (menunjukkan rentetan sisa) hendaklah NULL. Walau bagaimanapun, syarat tertentu boleh membawa kepada rentetan sisa bukan NULL walaupun dengan penukaran yang berjaya.

Penyelesaian:

Untuk mengesan ralat daripada strtol dengan tepat, pertimbangkan penambahbaikan berikut:

  1. Gunakan fungsi khusus untuk menggunakan strtol: Ini meningkatkan organisasi kod dan kebolehbacaan.
  2. Semak berbilang keadaan ralat: pengendalian ralat strtol adalah rumit. Selain sisa, anda juga harus menyemak rentetan angka yang tidak sah, limpahan angka dan ruang putih di hadapan/mengikuti.
  3. Tetapkan errno kepada 0 secara jelas sebelum memanggil strtol: Ini memastikan errno betul ditetapkan untuk menunjukkan sebarang ralat yang dihadapi.
  4. Semak ralat tertentu nilai: Sekiranya berlaku ralat, semak nilai errno yang dikaitkan dengan ERANGE (limpahan angka).

Fungsi Disemak:

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

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">if (parseLong(str, &value))
    // Conversion successful
else
    // Handle error
' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }

Penggunaan:

Fungsi yang disemak ini mengembalikan boolean kepada nyatakan sama ada penukaran berjaya atau tidak. Anda boleh menggunakannya seperti berikut:

Nota Tambahan:

  • Anda boleh menyesuaikan fungsi selanjutnya untuk mengendalikan pemangkasan ruang putih atau menyekat penukaran kepada nilai perpuluhan sahaja.
  • Dalam sesetengah senario, anda mungkin memerlukan mekanisme pelaporan ralat yang lebih berbutir, seperti mengembalikan kod ralat atau membuang pengecualian.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Ralat dengan Amanah Semasa Menukar Rentetan kepada Integer Panjang Menggunakan strtol dalam 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