Поскольку вы жестко запрограммировали размер substr()
, это означает, что числа имеют фиксированные позиции и ширину, и в этом случае вы можете просто использовать это вместо:
#include <string>
#include <array>
std::string test = "[1:2:3:4]cd/dvd PLDS DVD-RW DU8A6SH DU53 /dev/sr0";
std::array<int, 4> arr; // or: int arr[4]; pre-C++11
for(int i = 1, j = 0; i < 9; i += 2, ++j)
arr[j] = test[i]-'0';
Live Demo
Однако, если это не так, не делайте предположений о том, где находится закрывающий ]
. Используйте find()
, чтобы найти его, например:
std::string test = "[1:2:3:4]cd/dvd PLDS DVD-RW DU8A6SH DU53 /dev/sr0";
std::string::size_type begin = test.find('[') + 1;
std::string::size_type end = test.find(']', begin);
std::string sub = test.substr(begin, end - begin);
std::vector<int> arr;
std::istringstream iss(sub);
int temp;
while (iss >> temp) {
arr.push_back(temp);
iss.ignore();
}
Live Demo
Если вы используете C ++ 17 или новее, вы можете использовать std::string_view
и std::from_chars()
, чтобы уменьшить накладные расходы на память, поэтому вам не нужно выделять отдельный std::string
для sub
или std::istringstream
или даже использовать std::istringstream
, например:
std::string test = "[1:2:3:4]cd/dvd PLDS DVD-RW DU8A6SH DU53 /dev/sr0";
std::string_view sv(test.data(), test.size());
std::string_view::size_type begin = sv.find('[') + 1;
std::string_view::size_type end = sv.find(']', begin);
std::string_view sub = sv.substr(begin, end - begin);
std::vector<int> arr;
const char *pBegin = sub.data(), *pEnd = pBegin + sub.size();
int temp;
while (pBegin < pEnd)
{
auto [ptr, ec] = std::from_chars(pBegin, pEnd, temp);
if (ec != std::errc()) break;
arr.push_back(temp);
pBegin = ptr + 1;
}
Живая демонстрация