2015-07-22 3 views
1

Я пытаюсь сделать функцию, которая отфильтровывает все знаки препинания и пробелы в предложениях и возвращает только буквы и цифры в новой строке.Функция не возвращает нужную строку

ex. Если я напечатаю: Привет, меня зовут Zach1234. Я хочу, чтобы он возвращался только: himynameiszach1234

Однако он сохраняет только первую букву. Любые идеи о том, как исправить эту проблему?

#include <iostream> 
#include <cctype> 
using namespace std; 

string filter(string str) 
{ 
    string result = ""; 
    for(int i = 0; i < (str.size()-1); i++) 
    { 
     if(isspace(str[i]))continue; 
     if(ispunct(str[i]))continue; 
     if(isdigit(str[i]))result += str[i]; 
     if(isalpha(str[i]))result += str[i]; 
    } 
    return(result); 
} 


int main() 
{ 
    string happy; 

    cout <<"Please enter a string\n"; 
    cin >> happy; 

    cout << filter(happy) << endl; 

    return(0); 
} 
+1

Прежде всего, вы должны использовать 'getline()' для чтения на входе с пробелами. – NathanOliver

+0

@NathanOliver, это точно проблема, вы должны отправить ответ – vsoftco

+0

Это не позволит мне принять мой собственный ответ в течение двух дней –

ответ

1

Проблема заключается в том, что cin >> happy; не читает во всех ваших входных данных. Оператор >> остановится на первом символе пробела, который он читает, и оставьте это в потоке. Вместо этого вам нужно использовать std::getline().

std::getline(std::cin, happy) 

Это сохранит содержимое из потока в happy, пока он не достигнет новой строки или конец файла. Если он читает в новой строке, он не добавляется в строку, но отбрасывается. Вам необходимо позаботиться при смешении >> и `getline(): Need help with getline()

Как уже упоминалось, user5141375 Ваш цикл петли также является невосприимчивым. size() возвращает количество символов в строке, поэтому вам необходимо установить в i < str.size(), а не i < str.size() - 1

0

Проблема решена. Я должен был использовать getline() вместо cin.

1
cin >> happy; 

Этот код чтения строки из вашего входа, пока не получите пространство, так что если вы набираете:

Привет, меня зовут Zach1234

Вы получите:

Hi;

Для этого цикла,

for(int i = 0; i < (str.size()-1); i++) 

условие должно быть: i < str.size() или i <= str.size() - 1

+0

Пожалуйста, используйте 'i

+0

Эй, как вы можете видеть, я отредактировал ваш ответ, чтобы сделать его более читаемым. В будущем вы должны в полной мере использовать возможности форматирования SO, чтобы получить лучшие и читаемые ответы. – yizzlez

0

Вы также можете использовать isalnum() для вашей функции фильтрации для консолидации.

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