Неправильное редактирование строки
Не знаю как решить одну проблему: После выполнения цикла, строка удаляет все НЕмаленькие символы (97-122 - это маленькие англ. символы).
Проблема заключатеся в том, что в строке есть цыфры (1960). Цикл оставляет 90 не трогает. Как мне удалить все цифры тоже
string res = "the 1960s with the release of Letraset sheets containing Lorem";
// удаляем пробелы
for (int i = 0; i < res.size(); ++i) {
for (int j = 0; j < res[i].size(); ++j) {
if (res[i] == ' ')
res[i].erase(res[i].begin() + res[i].find(res[i]));
}
}
// заменяем большие символы на маленькие
for (int i = 0; i < res.size(); ++i) {
for (int j = 0; j < res[i].size(); ++j) {
if (isupper(res[i]))
res[i] = tolower(res[i]);
}
}
// удаляем остальные символы
for (int i = 0; i < res.size(); ++i) {
for (int j = 0; j < res[i].size(); ++j) {
if (res[i] < 97 || res[i] > 122)
res[i].erase(res[i].begin() + res[i].find(res[i]));
}
}
Ответы (1 шт):
Автор решения: AR Hovsepyan
→ Ссылка
Чтобы каждый раз не менять размер строки, эффективнее перемещать в конец все не буквы, а потом удалить эти перемещенные элементы. Заодно можно сразу заменить большие буквы на маленькие. Можно это сделать с помощью функтора:
//...
#include <algorithm>
//функтор, определяющий является ли буквой символ
//если да и бува большая, заменяет на маленькую
struct Checker {
bool operator ()(char& c) {
bool b = isalpha(c);
if (b && isupper(c))
c = tolower(c);
return !b;
}
};
int main()
{
string res = "the 1960s with the release of Letraset sheets containing Lorem";
//перемещаем в конец все сиволы по нашему функтору и сохраняем итератор на эту позицию
auto p = std::remove_if(res.begin(), res.end(), Checker());
//удаляем все элементы начиная с этой позиции
res.erase(p, res.end());
cout << res;
return 0;
}
Или же, если хотите удалять каждый раз, то начинайте с конца, чтобы индекс не менялся:
int i = res.size();
while (--i >= 0) {
if (isalpha(res[i])) {
if (isupper(res[i]))
res[i] = tolower(res[i]);
}
//если это не буква, то удаляем один элемент на этой позиции
else
res.erase(i, 1);
}