Разделение строки на отдельные части

233
14 ноября 2018, 11:50

Недавно писал программу и столкнулся с одной проблемой.

Проблема заключалась в строке:

string s = "7@";

Так вот в чем же сама проблема:

"7" - это номер ключа в моей программе, а "@" - это часть ключа (вид). В одной функции мне надо узнать именно этот вид ключа(без цифры).

Как это сделать? Разделить эту строку на "7" и "@" отдельно?

Answer 1

Не совсем понятно, зачем в данном случае вообще разделять строку. Строка здесь - некий "контейнер", зачем же нам тогда нарушать его целостность, если мы всего лишь хотим прочитать один из его элементов?

Так что вопрос здесь - "Как получить значение символа строки, зная его индекс?".

Способов получить значение символа в строке у нас много:

1. operator[]

Наверное, самый привычный для новичков способ из представленных - с его помощью можно получить доступ к элементам массива. Применение абсолютно идентичное:

    std::string str = "7@";
    std::cout << str[1];

2. std::string::at(size_t)

Очень похожий на предыдущий оператор метод, принимает все тот же индекс, но при этом проверяет, не вышел ли этот индекс за пределы массива. Применение:

    std::string str = "7@";
    std::cout << str.at(1);

3. std::string::back()

В вопросе сказано, что нужный элемент находится на 2м месте, а размер строки - 2, значит, нужный элемент является последним в строке. У std::string есть метод обращения к первому и последнему элементу - front и back, в данном случае нам, очевидно, нужен std::string::back:

    std::string str = "7@";
    std::cout << str.back();

Почему не стоит использовать std::string::substr(...), как указали в комментариях

Все просто, substr(...) возвращает std::string, пускай даже от одного элемента, это все равно строка, а не символ.

Представим ситуацию, у нас есть функция, которая принимает символ:

void foobar(char) {...}

Использование substr не будет работать - нам нужен char, а не string. Для данного вопроса можно, конечно, решить эту проблему:

std::string str = "7@";
foobar(str.substr(1, 1)[0]); // замечательно
foobar(str.substr(1, 1).at(0)); // еще лучше

Думаю, тут и без объяснений все ясно :)

Поэтому не стоит изобретать велосипед, если нам нужно получить символ - используем методы строки для получения символа, а не подстроки.

Answer 2

Получить из строки цифры и буквы:

string s("2algo34rithm5"), numbers, letters;
size_t pos = stable_partition(s.begin(), s.end(),
                       [](char c) { return isdigit(c); }) - s.begin();
numbers = s.substr(0, pos);  //все цифры
letters = s.substr(pos);    //все буквы 
READ ALSO
Паразитный курсор в SFML

Паразитный курсор в SFML

Дело заключается в том что при вождении курсора в окне sfml при нажатии клавиши движения, персонаж движется быстрее и рывкамиСоответственно...

196
C++ Windows API WebKit

C++ Windows API WebKit

Как собрать C++ Windows API Desktop приложение с WebKit? Видел WebKitNET но интересует чисто C++

151
Частичная расшифровка файла

Частичная расшифровка файла

Есть файлы, зашифрованные с помощью библиотеки Crypto++, алгоритм CBC

176
Ограничить величину int c++?

Ограничить величину int c++?

Например есть

167