- Сканируем строку, разбиваем ее на поля по пустым символам (например при помощи методов find_first_not_of и find_first_of из string)
- Из каждого поля пытаемся выделить субполя, используя в качестве знака разделителя символ равенства (например при помощи find).
- Если выделение прошло успешно, то пытаемся преобразовать выделенное субполе с числом в число и сохраняем его в векторе, если преобразование было успешным. А если вместо числа был мусор то выводим сообщение об ошибке
- Если не достигнут конец данных, то переходим к пункту №1
Вообще на Си++ это все делать не очень удобно, так как его библиотека работы со строками не содержит ряда полезных вещей. Если делать все правильно, то код получится достаточно большим, а если делать, как показано в ответах выше, то велик шанс получить мусор и узнать об этом только когда будет уже поздно. В качестве демонстрации вышеизложенного подхода привожу код на Rust
static DATA: &str =
"A11=15 A12=28 A13=2 A14=47\n
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n
A21=20 A22=19 A23=12 A24=48\n
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n
A31=3 A32=47 A33=41 A34=45
*/*/*/*/*/*/*/*/*/*/*/*/*/*/\n
";
fn main()
{
// Разобъем данные сначала на строки, а потом строки на отдельные поля,
// отсеяв предварительно часть мусора, а потом поля превратим в числа
// Сохраним результат в вектре из вектров чисел
let num_vec: Vec::<Vec::<i32>> = DATA.lines()
// Отсеим мусор
.filter(|s| s.contains('='))
.map(|s|
// Преобразование строки в набор строковых полей
s.split_whitespace()
// Разбор поля на субполя и преобразование в число
.filter_map(|f|
match f.rsplit_once('=')
{
Some((_,val)) =>
{
Some( i32::from_str_radix(val, 10)
.expect("Ошибка преобразования числа в строку") )
},
None => None
}
)
.collect()
)
.collect();
// Выведем результат на экран
for row in num_vec
{
println!("{:?}", row);
}
}
Для не знакомого с Rust человека код может выглядеть странно, поэтому поясню - тут используется конвейер из адаптеров итераторов, которые постепенно делают то, что нам нужно а collect() в самом конце собирает все данные в вектор.