2016-05-06 6 views
0

Lets sagen, dass ich etwas als solche haben:Der beste Weg, um die Wörter und das Apostroph nur in einer Zeichenkette zu behalten?

string s; 
cout << "Enter a word:"; 
cin >> s; 

//clean s 

print(s); 

Wenn jemand so etwas wie --sorry oder what, betritt, möchte ich vor dem ‚sauberen‘ die Zeichenfolge, um es in die Funktion übergeben, die das Wort ausdruckt. Eine Schnur zu säubern macht es ein Wort. In diesem Fall würde ein Wort wie alle aufeinander folgende Zeichenfolge aus Buchstaben definiert werden (können Sie auch Apostrophe dort sein, zum Beispiel don't ist ein Wort, also von irgendetwas anderes in es loszuwerden

Ich war so etwas wie dies zu denken..

.
string s; 
cout << "Enter a word:"; 
cin >> s; 

//clean s 
string s2; 
for (int i = 0; i < s.length(); i++) 
    if(isalpha(s[i]) || s[i] = "'") 
     s2[i] = s[i]; 

print(s2); 

Aber das macht mein Programm nicht funktioniert, so dass ich einen anderen Weg, um herauszufinden, müssen dies zu tun,

Danke

bearbeiten:

string s; 
cout << "Enter a word:"; 
cin >> s; 

//clean s 
s.erase(remove_if(s.begin(), s.end(), [](char c) {return !isalpha(c) || 
c == '\'' || c == '\-' || c == ','; })); 

print(s); 

Edit (spätestens):

s.erase(
    std::remove_if(s.begin(), s.end(), [](char c) { return ???; }), 
    s.end() 
    ); 

Füllen Sie das ??? mit dem entsprechenden Filter für Zeichen, die Sie loswerden wollen:

#include<iostream> 
#include<string> 
#include<algorithm> 
using namespace std; 
int main(){ 

    string s; 
    cout << "Enter a word:"; 
    cin >> s; 

    //clean s 
    s.erase(remove_if(s.begin(), s.end(), [](char c) 
    { 
     return !isalpha(c) || c == '\'' || c == '-' || c == ',' || c == ';' || c == ':'; 
    })); 

    cout << s; 
} 
+0

Sie Zugriff 's2' Reichweite heraus ... und Sie sollten 2-Indizes haben – bolov

+0

Ist C++ 11 und [' regex_replace'] (http://en.cppreference.com/w/cpp/regex/regex_replace) eine Option? – tadman

+0

Sie können das lokale festlegen, um alles außer Zeichen und Apostrophen als Leerzeichen zu behandeln (daher werden sie beim Lesen mit 'operator >>' ignoriert). http://StackOverflow.com/A/6154217/14065 –

Antwort

2

Das Problem ist, dass s2 ist standardmäßig aufgebaut. Das bedeutet, dass es eine Größe von 0. Wenn Sie versuchen, Zeichen speichern in die sie mit

for (int i = 0; i < s.length(); i++) 
    if(isalpha(s[i]) || s[i] = "'") 
     s2[i] = s[i]; 

Sie versuchen, auf Speicher zuzugreifen, die nicht existiert. Was können Sie tun, ist die += Betreiber Zeichenfolge verwenden, um die gültigen Zeichen von s1 in s2 wie

for (int i = 0; i < s.length(); i++) 
    if(isalpha(s[i]) || s[i] = "'") 
     s2 += s[i]; 

Sie auch die Lösch-remove Idiom verwenden könnte hinzufügen und nur s1 ändern und nicht einmal s2 haben. Sie könnten das tun, wie

s1.erase(std::remove_if(s1.begin(), s1.end(), 
         [](char ch){ return !(std::isalpha(ch) || ch == '\''); }), 
     s1.end()); 
+0

wenn ich es ohne den löschen-entfernen Idiot tun, gibt es mir eine Fehlermeldung, weil 's [i] =" '"' nicht funktioniert (ein Wert vom Typ const char * kann nicht einer Entität vom Typ char zugewiesen werden). Ich habe es auch mit zwei Gleichheitszeichen versucht und es funktioniert immer noch nicht. – StacksAndParsing

+0

@StacksAndParsing Was ist der aktualisierte Code, den du benutzt hast? Sie sollten nur in der Lage sein, zu kopieren und einzufügen, was ich geschrieben habe. – NathanOliver

+0

Ich aktualisierte es über – StacksAndParsing

3

Sie werden die erase-remove idiom verwenden möchten. Vielleicht so etwas wie:

[](char c){ return !isalpha(c) && c != '\''; } 
+0

Ich versuchte 's.Erase (remove_if (s.begin(), s.end(), [] (charc) {return! isalpha (c) && c ! = '-', ',';})); 'aber jetzt entfernt es das erste Zeichen der Zeichenkette und es gibt immer noch Kommas und Zeug – StacksAndParsing

+0

@StacksAndParsing Beachte, welche Argumente ich an' erase() 'übergebe. Was machst du da auch mit dem Komma, das ist total falsch. – Barry

+0

@StacksAndParsing Ihr Filter ist im Grunde genommen 'return true;' – Barry

Verwandte Themen