С++?
В старом вонючем на stringstream. В новом модном модно брать внешние либы. Гуглится scnlib
мы проверили эту scnlib и уверены, что в ней не живёт UB? Мы доверяем свой продукт (пусть и какую-то домашнюю поделку, окей), некоему 20-летнему фину?
домашнюю поделку можно доверить
Ты либо берешь готовую библиотеку, либо ::scanf, либо пишешь сам. Так всегда было
если тебе чиселки парсить, то from_chars
Мне 1 раз в одном месте распарсить "%u-%u-%u" тащить ради такого удовольствия дополнительную либу - это сильно
Та возьми sscanf, в чем проблема?)
в том что я за каким-то лешим переделал std::string на std::string_view. sscanf c ним плохо дружит. вообще проблема решена путём создания временного std::string, нооо.... хочется "правильнее"
У string_view ведь есть метод data(), который возвращает const char*
А нуль-терминатор есть?))
strlen работает, значит должен быть
А если логику включить?
Он необзятельно вернёт нультерминированную строку
from_chars - это std, если что
я так понимаю, она будет нультерминированной, если это была "последняя" или "единственная переданная строка" Если же я деребаню длинную строку по каким-то токенам в string_view то в data() у меня будет "строка" от нужного места и до конца оригинальной строки
Если он был создан из std string - то вернёт. Я так понял, у @ChuviW до этого были как раз std string
Ну это не значит, что он не использует методы, которые могут убрать нуль
у меня деребанивалка строки принимала std::string и возвращала вектор из std::string теперь она принимает string_view и возвращает вектор из string_view.
Так чем для чисел не подходит from_chars?
не значит, никто его там не обещает
ты можешь работать и со string_view: #include <charconv> #include <iostream> #include <regex> #include <string_view> int to_int(const std::sub_match<std::string_view::const_iterator>& sm) { int d; std::from_chars(sm.first, sm.second, d); return d; } int main() { std::regex r{"(\\d+)-(\\d+)-(\\d+)"}; std::string_view sv{"10-20-30"}; std::match_results<std::string_view::const_iterator> m; if( std::regex_match(sv.begin(), sv.end(), m, r) ) { int a = to_int(m[1]); int b = to_int(m[2]); int c = to_int(m[3]); std::cout << a << '-' << b << '-' << c << std::endl; } }
Спасибо, схоронил
Обсуждают сегодня