Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Функция для удаления всех знаков препинания


Автор: dimaSlon 25.6.2017, 09:52
Есть набор строк, написать функцию, которая принимает на вход этот набор строк и возвращает новый набор строк, где в каждом из строк удалено все знаки препинания: ",.!:" Используя: std::remove_if, std::erase, std::transform
То что у меня уже есть но не работает и нужна ваша помощь:
Код

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
std::vector<char> remove(std::vector<char>& s)
{
    if (std::any_of(s.begin(), s.end(), ispunct))
        s.erase(std::remove_if(s.begin(), s.end(), ispunct), s.end());
    return s;
}

bool shouldBeRemoved(char words)
{
    std::vector<char> vector;
    for (int index = 0; index < vector.size(); ++index)
        vector.emplace_back(words);
    std::transform(vector.begin(), vector.end(), vector.begin(), &remove);
}

int main()
{
    char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
    shouldBeRemoved(*words);
    for (const auto& i : words)
    {
        std::cout << i << "\n";
    }
    return 0;
}

Автор: dimaSlon 25.6.2017, 11:36
какой тип должен быть в функции remove вместо auto, и правильно ли я делаю что передаю bool?
и правильно я  делаю:
Код

std::transform(vector.begin(), vector.end(), vector.begin(), remove);


Код

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
bool remove(auto& сh)
{
    if (std::any_of(сh.begin(), сh.end(), ispunct))
        сh.erase(std::remove_if(сh.begin(), сh.end(), ispunct), сh.end());
    return сh;
}

bool shouldBeRemoved(char words)
{
    std::vector<char> vector;
    for (int index = 0; index < vector.size(); ++index)
        vector.emplace_back(words);
    std::transform(vector.begin(), vector.end(), vector.begin(), remove);
}

int main()
{
    char words[] = { "The requested page title was invalid, empty, or: an incorrectly linked inter-language! or inter-wiki title. It may contain one or more, characters that cannot, be used in titles." };
    shouldBeRemoved(*words);
    for (const auto& i : words)
    {
        std::cout << i << "\n";
    }
    return 0;
}

Автор: xvr 1.7.2017, 10:35
Вы бы для начала почитали, что именно ваши функции (std::remove_if, std::erase, std::transform) делают. В частности std::transform не может ничего удалить, что бы вы ей не подавали

Цитата(dimaSlon @  25.6.2017,  11:36 Найти цитируемый пост)
и правильно я  делаю:

Нет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)