Убрать / удалить символы из пользовательского ввода в C ++ - PullRequest
2 голосов
/ 16 февраля 2012

Вот что у меня есть:

string stripSymbols(string str) {
    int stringSize = strlen(str.c_str());

    for (int i = 0; i < stringSize; i++)
        if (str[i] == 0x46)
            str[i] = 0x32;
    return str;
}

Я знаю, что коды ascii, вероятно, неверны.Это часть проблемы.Но как только я это выяснил, я подумал, что мог бы поставить здесь переключатель для каждого символа, который заменил бы каждый символ пустым пробелом.

Или еще лучше, у меня мог бы быть цикл for в моем forцикл, который проходит по цепочке символов и заменяет все, которые совпадают с вводом пользователя, пустым пробелом.

У меня есть пара идей, но мне было интересно, есть ли более эффективный способ сделать это.

Обновление 1:

Этот код выглядит немного лучше и работает:

string stripSymbols(string str) {
    int stringSize = str.size();
    for (int i = 0; i < stringSize; i++)
        if (str[i] == '.')
            str[i] = ' ';
    return str;
}

Но ответы предлагают более эффективное решение.

Обновление 2:

Решение, основанное на ответе Kerrek SB:

char symbols [] = {'!', '?', ',', '\'', '.'};
int symbols_size = sizeof(symbols) / sizeof(char);  

for (int j = 0; j < symbols_size; j++)
    replace(str.begin(), str.end(), symbols[j], ' ');

Ответы [ 5 ]

3 голосов
/ 16 февраля 2012

Если вы хотите заменить любой не алфавитно-цифровой символ пробелом:

std::replace_if(str.begin(), str.end(), [](char c){return !std::isalnum(c);}, ' ');
2 голосов
/ 16 февраля 2012

Я бы попробовал что-то вроде этого:

std::replace(str.begin(), str.end(), 0x46, 0x32);

Вы можете сделать это даже в оригинальном контексте, не требуя отдельной функции.Вам нужно #include <algorithm>.

2 голосов
/ 16 февраля 2012

Если бы я искал надежное решение, я бы просто использовал boost::regex_replace:

// regex with illegal characters
std::string output = boost::regex_replace(str, "[!@#%]", " ");

Документация

2 голосов
/ 16 февраля 2012

Взгляните на string::find и string::replace методы.

0 голосов
/ 16 февраля 2012

Желаете ли вы просто удалить / заменить каждый экземпляр определенного символа из std::string? Если это так, посмотрите эти похожие вопросы:

Как заменить все вхождения символа в строке?

Удаление пробелов из std :: string в C ++

И просто используйте концепции, отображаемые в ответах, в соответствии со своими собственными целями.

...