2013-10-02 25 views
10

Ho ottenuto una stringa e voglio rimuovere tutte le punteggiature da esso. Come lo faccio? Ho fatto alcune ricerche e ho scoperto che le persone usano la funzione ispunct() (l'ho provato), ma non riesco a farlo funzionare nel mio codice. Qualcuno ha qualche idea?C++ Rimuovi la punteggiatura da String

#include <string> 

int main() { 

string text = "this. is my string. it's here." 

if (ispunct(text)) 
text.erase(); 

return 0; 
} 
+0

È necessario controllare tutti i caratteri uno per uno. –

risposta

-3

ho capito.

size_t found = text.find('.'); 
text.erase(found, 1); 
+0

Questo cancellerà solo la prima istanza di ".", Non rimuoverà tutta la punteggiatura e non tutte le istanze di ".". – pippin1289

+0

ma con ciclo for funziona – NewFile

+0

dovresti modificare le tue risposte per non ingannare gli altri. Ma rimuove anche solo "." Non tutta la punteggiatura. – pippin1289

5

ispunct assume un valore non char una stringa.

potete fare come

for (auto c : string) 
    if (ispunct(c)) text.erase(text.find_first_of(c)); 

Questo funzionerà ma è un algoritmo lento.

+3

text.erase()? sei sicuro? –

+1

mi hai preso. 'text.erase()' non funzionerà. –

1

Il problema qui è che ispunct() accetta un argomento come carattere, mentre si sta tentando di inviare una stringa. Si dovrebbe ciclo sugli elementi della stringa e cancellare ogni carattere, se si tratta di una punteggiatura come qui:

for(size_t i = 0; i<text.length(); ++i) 
    if(ispunct(text[i])) 
    text.erase(i--, 1); 
4
#include <string> 
#include <iostream> 
#include <cctype> 

int main() { 

    std::string text = "this. is my string. it's here."; 

    for (int i = 0, len = text.size(); i < len; i++) 
    { 
     if (ispunct(text[i])) 
     { 
      text.erase(i--, 1); 
      len = text.size(); 
     } 
    } 

    std::cout << text; 
    return 0; 
} 

uscita

this is my string its here 

Quando si elimina un carattere, la dimensione del la stringa cambia. Deve essere aggiornato ogni volta che si verifica la cancellazione. E hai eliminato il carattere attuale, quindi il carattere successivo diventa il carattere corrente. Se non si decrementa il contatore del ciclo, il carattere accanto al carattere di punteggiatura non verrà controllato.

+0

Non riesco a compilare l'ispunct. ho incluso tutte le intestazioni che hai fatto. – NewFile

+1

Devi includere "" o "". – thefourtheye

19

utilizzando l'algoritmo remove_copy_if: -

string text,result; 
std::remove_copy_if(text.begin(), text.end(),    
         std::back_inserter(result), //Store output   
         std::ptr_fun<int, int>(&std::ispunct) 
         ); 
1
#include <iostream> 
#include <string> 
#include <algorithm> 
using namespace std; 

int main() { 
    string str = "this. is my string. it's here."; 

    transform(str.begin(), str.end(), str.begin(), [](char ch) 
    { 
     if(ispunct(ch)) 
      return '\0'; 
     return ch; 
    }); 
} 
8

POW ha già una buona risposta, se avete bisogno il risultato come una nuova stringa. Questa risposta è come gestirla se si desidera un aggiornamento sul posto.

La prima parte della ricetta è std::remove_if, che può rimuovere la punteggiatura in modo efficiente, comprimendo tutta la non punteggiatura.

std::remove_if (text.begin(), text.end(), ispunct) 

Purtroppo, std::remove_if non compatta la stringa alla nuova dimensione. Non può perché non ha accesso al contenitore stesso. Pertanto, ci sono caratteri indesiderati rimasti nella stringa dopo il risultato del pacchetto.

Per gestire ciò, std::remove_if restituisce un iteratore che indica la parte della stringa ancora necessaria. Questo può essere usato con le stringhe erase metodo, che porta alla seguente idioma ...

text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end()); 

[EDIT - Non posso credere che ho appena ricevuto che sbagliato - gli iteratori per erase dovrebbe indicare l'intervallo per rimuovere , non la gamma da tenere.]

Io chiamo questo un idioma perché è una tecnica comune che funziona in molte situazioni.Altri tipi di string forniscono i metodi adatti erase e std::remove (e probabilmente alcune altre funzioni della libreria di algoritmi che ho dimenticato per il momento) adottano questo approccio per chiudere gli spazi per gli elementi rimossi, ma lasciando il ridimensionamento del contenitore al chiamante.

0
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string s;//string is defined here. 

    cout << "Please enter a string with punctuation's: " << endl;//Asking for users input 

    getline(cin, s);//reads in a single string one line at a time 

/* ERROR Check: The loop didn't run at first because a semi-colon was placed at the end 
       of the statement. Remember not to add it for loops. */ 
     for(auto &c : s) //loop checks every character 
     {  
      if (ispunct(c)) //to see if its a punctuation 
       { 
       c=' ';  //if so it replaces it with a blank space.(delete) 
       } 

     } 

     cout << s << endl; 


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

Un altro modo si potrebbe fare questo potrebbe essere il seguente:

#include <ctype.h> //needed for ispunct() 
string onlyLetters(string str){ 
    string retStr = ""; 

    for(int i = 0; i < str.length(); i++){ 
     if(!ispunct(str[i])){ 
      retStr += str[i]; 
     } 
    } 
    return retStr; 

questo finisce per creare una nuova stringa in realtà invece di cancellare i caratteri dalla stringa vecchia, ma è un po 'più facile avvolgi la testa piuttosto che usare alcune delle funzioni integrate più complesse.

0

Provare a utilizzare questo, rimuoverà tutta la punteggiatura della stringa nel file di testo Oky. str.erase (remove_if (str.begin(), str.end(), :: ispunct), str.end());

Si prega di rispondere se utile

Problemi correlati