Устранить знаки препинания и пробелы

Я новичок в программировании на 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;
}

3

Решение

Если вы хотите удалить символы, кроме буквы а также цифры, лучший выбор будет использовать стереть-удалить идиому.

  1. использование
    std::isalnum
    проверить символ в строке либо алфавит или
    числовой. Если вы упакуете его в унарный предикат (лямбда-функция), вы можете применить к следующей функции алгоритма.
  2. С помощью
    std::remove_if,
    и вышеупомянутый предикат, собрать все символы в
    Строка, которая должна была быть удалена.
  3. Наконец, используя
    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 хорошо объяснил это в его ответ), скорее это может быть полезно для будущих читателей.

2

Другие решения

Ваш код просто заменяет один символ другим. Простой способ удалить символы из строки — это использовать 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 когда мы не удаляем символ, в противном случае вы пропустите символ после того, как он был удален, потому что строка теперь стала короче.

1

\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)
0
По вопросам рекламы [email protected]