10
votes

Remplacer l'espace avec un soulignement

J'essaie d'écrire quelque chose qui remplacera tous les espaces d'une chaîne avec un soulignement.

Ce que j'ai jusqu'à présent. P>

string word;
cin >> word;
word = space2underscore(word);
cout << word;


0 commentaires

5 Réponses :


5
votes

Le problème est avec votre compréhension de std :: Cin dans la bibliothèque iOSTream : Utilisation de l'opérateur >> sur un flux avec un flux STD :: String Comme l'argument à droite ne prend qu'un mot à la fois (à l'aide de WhitSpace pour séparer).

Ce que vous voulez plutôt utiliser std :: getline () pour obtenir votre chaîne.


0 commentaires

15
votes

Le problème est que CIN >> Word code> ne va lire que dans le premier mot. Si vous souhaitez exploiter un tout comme à la fois, vous devez utiliser std :: GetLine code> .

Par exemple: P>

std::string s = "hello stackoverflow";
std::transform(s.begin(), s.end(), s.begin(), [](char ch) {
    return ch == ' ' ? '_' : ch;
});
std::cout << s << std::endl;


6 commentaires

Désolé d'être pédants, mais vous mélangez si vous utilisez ou non std :: ou non. (Bien que techniquement, votre code fonctionne avec à l'aide de std :: cout; en haut)


@Platinum Azure: Vous avez raison, personnellement, j'aime utiliser un std :: mais j'ai copié une partie du code de l'OP dans mon exemple. Je vais nettoyer ça.


Merci Monsieur! Mon programme court maintenant :)


J'aime vraiment, vraiment comme Lambdas, mais dans ce cas std :: remplacer peut être un meilleur ajustement.


@BlastFurnace: Je dois être honnête, j'ai complètement oublié std :: remplacer , bon appel!


@Évan Teran: Chaque fois que je me trouve en train d'écrire encore un autre pour boucle, j'aime vérifier la bibliothèque standard. Il y a généralement quelque chose qui est correct, rapide, et avec un nom plus significatif que pour ou pendant . Le moins de code que je dois écrire signifie aussi moins de bogues.



-1
votes

remplacer xxx

avec xxx


0 commentaires

24
votes

Vous avez votre getline code> problème résolu mais je voulais juste dire que la bibliothèque standard contient beaucoup de fonctions utiles. Au lieu d'une boucle laminée à la main, vous pourriez faire:

std::string space2underscore(std::string text)
{
    std::replace(text.begin(), text.end(), ' ', '_');
    return text;
}


1 commentaires

N'oubliez pas de mentionner que cela nécessite fichier d'en-tête à inclure dans votre projet.



1
votes

Pour une approche moderne C ++ 1x Vous avez la possibilité de STD :: Regex_replace .

#include <regex>
#include <string>
#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;
using std::regex;
using std::string;
using std::regex_replace;

int main( const int, const char** )
{
   const auto target = regex{ " " };
   const auto replacement = string{ "_" };
   const auto value = string{ "hello stackoverflow" };

   cout << regex_replace( value, target, replacement ) << endl;

   return EXIT_SUCCESS;
}


0 commentaires