C ++ Elimina la puntuación de String

Recibí una cadena y quiero eliminar todas las puntuaciones de ella. ¿Cómo puedo hacer eso? Investigué un poco y descubrí que las personas usan la función ispunct () (lo intenté), pero parece que no funciona en mi código. ¿Alguien tiene alguna idea?

#include  int main() { string text = "this. is my string. it's here." if (ispunct(text)) text.erase(); return 0; } 

Usando el algoritmo remove_copy_if : –

 string text,result; std::remove_copy_if(text.begin(), text.end(), std::back_inserter(result), //Store output std::ptr_fun(&std::ispunct) ); 

POW ya tiene una buena respuesta si necesitas el resultado como una nueva cadena. Esta respuesta es cómo manejarlo si desea una actualización en el lugar.

La primera parte de la receta es std::remove_if , que puede eliminar la puntuación de manera eficiente, empacando toda la no puntuación a medida que avanza.

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

Desafortunadamente, std::remove_if no reduce la cadena al nuevo tamaño. No puede porque no tiene acceso al contenedor en sí. Por lo tanto, quedan caracteres basura en la cadena después del resultado empaquetado.

Para manejar esto, std::remove_if devuelve un iterador que indica la parte de la cadena que aún se necesita. Esto se puede usar con el método de erase cadenas, lo que lleva al siguiente modismo …

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

Yo llamo a esto una expresión idiomática porque es una técnica común que funciona en muchas situaciones. Otros tipos de string proporcionan métodos de erase adecuados, y std::remove (y probablemente algunas otras funciones de biblioteca de algoritmos que he olvidado por el momento) toman este enfoque de cerrar las brechas para los elementos que eliminan, pero dejando el cambio de tamaño del contenedor a la llamador.

ispunct toma un valor de char no una cadena.

puedes hacer como

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

Esto funcionará, pero es un algoritmo lento.

 #include  #include  #include  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; } 

Salida

 this is my string its here 

Cuando elimina un personaje, el tamaño de la cadena cambia. Tiene que ser actualizado cada vez que ocurre una eliminación. Y eliminó el carácter actual, por lo que el siguiente personaje se convierte en el personaje actual. Si no disminuye el contador de bucles, el carácter al lado del carácter de puntuación no se marcará.

El problema aquí es que ispunct () toma un argumento como un carácter, mientras que usted está tratando de enviar una cadena. Debería recorrer los elementos de la cadena y borrar cada carácter si es una puntuación como aquí:

 for(size_t i = 0; i 
 #include  #include  #include  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; }); } 

Otra forma de hacerlo podría ser la siguiente:

 #include  //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; 

Esto termina creando una nueva cadena en lugar de borrar los caracteres de la cadena anterior, pero es un poco más fácil entender que usar algunas de las funciones integradas más complejas.

  #include  #include  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; } 

Intenta usar este, eliminará toda la puntuación de la cadena en el archivo de texto oky. str.erase (remove_if (str.begin (), str.end (), :: ispunct), str.end ());

por favor responde si útil

Entiendo.

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