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

DDD
Lepaskan: 2024-11-06 03:38:02
asal
838 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan