2012-02-16 3 views
2

Вот то, что я до сих пор:Газа/удалить символы из UserInput в C++

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

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

Update 1:

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

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

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

Update 2:

Решение вдохновленный ответ Kerrek Саи Бабы:

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

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

Если вы не уверены о кодах ASCII, почему бы не использовать буквенные символы вместо использования цифровых кодов и надеясь, что они правы ? –

+1

Jeez ... кто дал вам идею написать 'strlen (str.c_str())' ??? Как насчет 'str.size()'? –

+0

Я согласен с предыдущими комментариями, я просто добавлю: вы можете передать 'str' по ссылке и ничего не возвращать. Насколько я понимаю, вы собираетесь использовать свою функцию следующим образом: 'str = stripSymbols (str);'. – LihO

ответ

2

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

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

Documentation

0

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

How to replace all occurrences of a character in string?

Remove spaces from std::string in C++

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

2

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

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

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

+0

Я решил использовать это решение с циклом for. Очень элегантно. –

3

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

std::replace_if(str.begin(), str.end(), [](char c){return !std::isalnum(c);}, ' ');