Я новичок в программировании на C ++ и хотел бы написать программу, которая имеет следующие требования:
Данный текст состоит из
Отфильтруйте любые символы, которые не находятся в диапазоне 0..9
, a..z
или же A..Z
,
Это означает, что когда я набрал:
The quick brown fox jumps over the lazy dog!
Выход будет:
Thequickbrownfoxjumpsoverthelazydog
Я набрал следующие коды и попытался запустить его, и результат в порядке. Тем не менее, когда я отправил его на другую платформу c ++ для проверки правильности, не было сгенерированного вывода.
Я так растерялся … Пожалуйста, помогите, если сможете. Большое спасибо всем вам.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
getline(cin, line);
for (int i = 0; i < line.size(); ++i)
{
if (!((line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') || (line[i] >= '0' && line[i] <= '9')))
{
line[i] = '\0';
}
}
cout << line;
return 0;
}
Если вы хотите удалить символы, кроме буквы а также цифры, лучший выбор будет использовать стереть-удалить идиому.
std::isalnum
std::remove_if
,std::string::erase
std::remove_if
,Примерно так:
Посмотреть демо здесь
#include <cctype> // std::isalnum
#include <algorithm> // std::remove_if
std::string str{ "The quick brown fox jumps over the lazy dog!" };
// predicate to check the charectors
const auto check = [](const char eachCar)->bool { return !std::isalnum(eachCar); };
// collect the chars which needed to be removed from the string
const auto charsToRemove = std::remove_if(str.begin(), str.end(), check);
// erase them out
str.erase(charsToRemove, str.end());
отказ: Приведенное выше решение не покрывает озабоченность ОП (@john хорошо объяснил это в его ответ), скорее это может быть полезно для будущих читателей.
Ваш код просто заменяет один символ другим. Простой способ удалить символы из строки — это использовать erase
метод. Что-то вроде этого
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
getline(cin, line);
for (int i = 0; i < line.size(); )
{
if (!((line[i] >= 'a' && line[i]<='z') || (line[i] >= 'A' && line[i]<='Z')||(line[i] >= '0' && line[i]<='9')))
{
line.erase(i, 1);
}
else
{
++i;
}
}
cout << line;
return 0;
}
Обратите внимание, что код добавляет только один к i
когда мы не удаляем символ, в противном случае вы пропустите символ после того, как он был удален, потому что строка теперь стала короче.
\0
это конец строки, поэтому, когда вы используете это, вы обрезаете свою строку при первом появлении.
Вам лучше удалить этот символ из вашего массива, но тогда я бы посоветовал вам перейти от конца к началу:
Псевдо-код:
for i = size(line)-1 back to i = 0:
if line[i] in ('a'-'z', 'A'-'Z', ...):
for j = i to size(line)-1:
line[j] = line[j+1]
reduce_by_the_last_character(line)