2013-03-31 3 views
0

Я хочу стереть все числа в строке (в конечном итоге все символы и пробелы) и сохранить все буквы в строке. В конечном итоге я пытаюсь найти палиндромы из больших блоков текста.Почему я не могу стереть числовые символы строки?

С тем, что я получил прямо сейчас, он будет стирать цифры; плюс все другие нецифровые символы после первого числового символа, который стирается. Я хочу знать, почему это делается и что я могу сделать, чтобы удалить только числовые символы.

#include <iostream> 
#include <string> 
#include <cctype> 
#include <ctype.h> 
#include <iterator> 
using namespace std; 

int main() 
{ 
bool con = true; 
while (con == true) 
{ 
cout << "Enter a string: "; 
string input; 
getline(cin, input); 

/** here is where I am attempting to erase all numeric characters in input string**/  
for(int i=0; i<input.length(); i++){ 

    if(isdigit(input.at(i))){ 

     string::iterator it; 
     it=input.begin()+i; 
     input.erase(i); 
    break; 
    } 
} 

string go; 

cout << input << endl; 

    cout << "Continue? y/n " << endl; 
    getline(cin, go); 
    if(go != "y") 
     con = false; 


} 
system("pause"); 
return 0; 
} 
+2

Обратите внимание, что вы можете использовать 'зЬй :: remove_if' в сочетании либо с лямбда или' станд :: not1' и 'std :: isalpha' для удаления всех, кроме алфавитных символов. Для только числовых символов, 'std :: remove_if' и' std :: isdigit'. – chris

+0

Спасибо. Тогда мне придется использовать isalpha. –

+0

@chris, 'std :: isalpha' не будет работать в этом случае, потому что он возвращает' int', а не 'bool'. Из-за необходимости неявного преобразования типов в этом случае он не будет работать. –

ответ

1
for(int i=0; i<input.length(); i++){ 

    if(isdigit(input.at(i))){ 

     string::iterator it; 
     it=input.begin()+i; 
     input.erase(i); 
    break; 
    } 
} 

Я не нравится этот фрагмент кода: решить, что использовать итераторы или индексы, я думаю, что вы shoudn`t смешивать их.
Существует ошибка в вас код:, когда вы удалите из строки `s длина также изменяется (так цикл не будет работать, а не использовать в то время как петля)

string::iterator it = input.begin(); 

    while (it != input.end()) 
    { 
     while(it != input.end() && isdigit(*it)) 
     { 
       it = input.erase(it); 
     } 
     if (it != input.end()) 
      ++it; 
    } 
+0

были i из него = input.erase (i); ? использование 'it' не дает правильного вывода. –

+0

opps, извините, я пропустил это, это должен быть итератор. Спасибо Я сделаю корректировки –

+0

w8ht дает выход 8t. Отбрасывание каждого другого персонажа. –

0

Я предлагаю исследовать, как string.erase() работ; версия, которая принимает один аргумент, удаляет все после и включая предоставленный индекс. Что необходимо исправить, ваша проблема меняется input.erase(i) до input.erase(i, 1). Версия, которая принимает два аргумента, удаляет количество символов, равное второму аргументу, начиная с позиции первых аргументов.

Кроме того, я не вижу цель этих двух линий в программе:

string::iterator it; 
it=input.begin()+i; 
1
cin >> inputString; 
for(string::iterator begin = inputString.begin(), end = inputString.end(); begin != end;){ 
    if(isdigit(*begin)){ 
    begin = inputString.erase(begin); 
    }else 
    ++begin; 
} 
//cout << inputString; 
Смежные вопросы