Устранить знаки препинания и пробелы - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в программировании на С ++ и хотел бы написать программу, которая имеет следующее требование:

Данный текст состоит из

  • слов
  • букв
  • чисел
  • знаков пунктуации и
  • пробелов.

Отфильтровать любые символы, которые не находятся в диапазоне 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 ]

0 голосов
/ 07 декабря 2018

Если вы хотите удалить символы, отличные от букв и цифр , лучшим выбором будет использование erase – remove идиома .

  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 хорошо объяснил это в своем ответе ), скорее, это может быть полезно для будущих читателей.

0 голосов
/ 07 декабря 2018

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

\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)
...