Modernes C++ programmieren

Okt 23, 2024

lst-0988-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/r5PqK8M8o 
#include <charconv>
#include <vector>
#include <iostream>
#include <string>

std::vector<size_t> num_to_vec(const std::string& nums) {
    std::vector<size_t> result {};
    // ohne Leerzeichen am Ende
    const auto end = nums.data() + nums.find_last_not_of( ' ' ) + 1;
    const char* st = nullptr; // Zählpointer in der Schleife
    auto last = nums.data();  // letztes nicht übersetztes Zeichen
    size_t n;                 // konvertierte Zahl
    do {
        for(st = last; (st<end)&&(*st==' ' ); ++st); // überspringe ' '
        if (last = std::from_chars(st, end, n).ptr; last != st)
            result.push_back(n);                     // speichere Zahl
    } while (last != st);
    return result;
}

void fehlerDemo(const char* buf, size_t sz) {
    int n;
    auto [p, ec] = std::from_chars(buf, buf+sz, n);
    if (ec != std::errc{}) {
       const auto error = std::make_error_code(ec);
       std::cout << error.message() << '\n';
    }
}

int main() {
    auto result = num_to_vec("12 33 43");

    for(auto r : result) std::cout << r << " ";
    std::cout << '\n';
    // Ausgabe: 12 33 43

    fehlerDemo("XYZ", 4);
    // Ausgabe: Invalid argument

    fehlerDemo("123123123123123", 16);
    // Ausgabe: Numerical result out of range
}