2015-07-08 6 views
0

Я пытаюсь удалить специальные символы из строки, которая находится в векторе. У меня возникли проблемы с тем, как точно удалить специальные символы. У меня есть векторные слова; который содержит слова из обычного текста, и я хочу удалить специальные символы, такие как ?!.,; и т. д., а также удалить пробелы.Удаление специального символа из вектора строк C++

+0

в то время как (входной_файл >> слово) \t \t { \t \t \t words.push_back (слово); \t \t} С этим я заполнил вектор и что получаю в результате: Право? wiliam "" и т. Д. Я хочу удалить специальные символы –

+0

Редактировать свой вопрос кодом, не помещать в комментарии. –

ответ

0

Вы могли бы пройти через ваш вектор и использовать

for(int p = 0; p < words.size(); p++) 
{ 
    for(int i = 0; i < words[p].length(); i++) 
    { 
     if(words[p][i] == ' ' || ...) 
     { 
      words[p].erase(i, 1); 
      i--; 
     } 
    } 
} 

Вместо ... положить остальные специальные символы, которые вы хотите удалить, поэтому она находит все из них.

Here больше информации об удалении. В основном, первым параметром является позиция первого символа, который вы хотите стереть, а второй параметр - количество стираемых символов.

+0

@FredLarson добавил исправление, спасибо за головы! –

0

Общий алгоритм выглядит следующим образом:

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

    int main() 
    { 
     vector<string> v; 
     // get data into v 

     for (auto& s : v){ 
      for (auto i = s.begin(); i != s.end(); ++i){ 
      if (*i == '?' || *i == '!'){ 
       i = s.erase(i); 
      } 
      } 
     } 

    } 
+0

Это пропустит персонажей. –

+0

Как он будет пропустить персонажей? – Bizkit

+1

Поскольку, как только вы удаляете символ, ваш индекс отключается на единицу. –

1

Стирание одного символа снова и не очень быстро. Задача может быть сделано путем создания новой строки и добавив к нему без специальных символов:

#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<string> words; 
    words.push_back(""); 
    words.push_back("452346457"); 
    words.push_back(",.,;,;.;,;.;.?"); 
    words.push_back(";m;,./,/;,m;m,/,./,;"); 

    string special = string("?:,.;"); 

    for (string::size_type i = 0; i < words.size(); ++i) 
    { 
    string temp = words[i]; 
    words[i] = ""; 
    for (string::size_type j = 0; j < temp.size(); ++j) 
    { 
     if (special.find(temp[j]) == string::npos) 
     { 
     words[i] += temp[j]; 
     } 
    } 
    } 

    for (string::size_type i = 0; i < words.size(); ++i) 
    { 
    cout << "\"" << words[i] << "\"\n"; 
    } 
} 

Обратите внимание на использование очень полезной find функции.

+1

Если количество специальных символов - большое число, лучше использовать 'std :: set ' для хранения каждого специального символа. Тогда использование 'find' будет быстрее. – PaulMcKenzie

Смежные вопросы