Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Rentetan kepada Integer dengan Pengendalian Ralat dalam C?

Bagaimana untuk Menukar Rentetan kepada Integer dengan Pengendalian Ralat dalam C?

DDD
DDDasal
2024-11-06 03:38:02861semak imbas

How to Convert Strings to Integers with Error Handling in C  ?

Menukar Rentetan kepada Integer dengan Pengendalian Ralat dalam C

Dalam pengaturcaraan, selalunya perlu untuk menukar rentetan kepada integer. Walaupun C menyediakan fungsi std::atoi untuk tujuan ini, ia tidak mengendalikan ralat penukaran dengan baik. Untuk menangani perkara ini, kami mencari penyelesaian yang membolehkan pengendalian ralat, serupa dengan Int32.TryParse C#.

Fungsi Cast Leksikal Boost

Pendekatan yang cekap ialah menggunakan fungsi lexical_cast daripada perpustakaan Boost . Ia menyokong pelbagai jenis data dan boleh membuang pengecualian jika pelakon gagal. Berikut ialah contoh:

<code class="cpp">#include <boost/lexical_cast.hpp>

int main() {
    std::string s;
    std::cin >> s;

    try {
        int i = boost::lexical_cast<int>(s);

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Menggunakan Fungsi Perpustakaan Standard

Jika Boost tidak tersedia, gabungan std::stringstream dan >> operator boleh digunakan:

<code class="cpp">#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string s;
    std::cin >> s;

    try {
        std::stringstream ss(s);

        int i;
        if ((ss >> i).fail() || !(ss >> std::ws).eof()) {
            throw std::bad_cast();
        }

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Faking Boost's Lexical Cast

Sebagai alternatif terakhir, versi "palsu" fungsi lexical_cast Boost boleh dibuat:

<code class="cpp">#include <iostream>
#include <sstream>
#include <string>

template <typename T>
T lexical_cast(const std::string& s) {
    std::stringstream ss(s);

    T result;
    if ((ss >> result).fail() || !(ss >> std::ws).eof()) {
        throw std::bad_cast();
    }

    return result;
}

int main() {
    std::string s;
    std::cin >> s;

    try {
        int i = lexical_cast<int>(s);

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Versi Tanpa Lempar

Jika versi tanpa buang dikehendaki, tangkap pengecualian yang sesuai dan kembalikan boolean yang menunjukkan kejayaan atau kegagalan:

<code class="cpp">template <typename T>
bool lexical_cast(const std::string& s, T& t) {
    try {
        t = lexical_cast<T>(s);
        return true;
    } catch (const std::bad_cast& e) {
        return false;
    }
}

int main() {
    std::string s;
    std::cin >> s;

    int i;
    if (!lexical_cast(s, i)) {
        std::cout << "Bad cast." << std::endl;
    }
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Menukar Rentetan kepada Integer dengan Pengendalian Ralat 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