2010-10-13 5 views
0

Étant donné une chaîne C++, str ("ab"), comment échanger le contenu de str pour qu'il devienne "ba"?Chaîne C++ - comment échanger une chaîne avec deux caractères?

Voici mon code:

string tmpStr("ab"); 

const char& tmpChar = tmpStr[0]; 
tmpStr[0] = tmpStr[1]; 
tmpStr[1] = tmpChar; 

Y at-il une meilleure façon?

+1

Pourquoi il devient '" bc "' pas '' ba''? – kennytm

+0

Voulez-vous "bc" ou "ba"? –

+0

Merci pour les commentaires et j'ai corrigé ma question. – q0987

Répondre

17

Comme ceci:

std::swap(tmpStr[0], tmpStr[1]); 

std::swap est situé dans <algorithm>.

+1

Probablement ce que l'OP voulait –

+1

Certainement +1 pour std :: swap. – Puppy

-2

Que diriez-vous:

std::string s("ab"); 

s[0] = 'b'; 
s[1] = 'c'; 

Ou

std::string s("ab"); 

s = std::string("bc"); 
+1

Clairement ce n'est pas ce que l'OP demandait ... –

+1

@John: pas si clair. Il voulait obtenir le résultat "bc". – ybungalobill

+0

Bonjour Rubenvb, Désolé pour ma faute de frappe et merci pour votre réponse. – q0987

6

Si vous voulez un marteau de forgeron pour cet écrou:

#include <algorithm> 
using namespace std; 

string value("ab"); 
reverse(value.begin(), value.end()); 

Celui-ci pourrait être utile pour la question de suivi impliquant « abc ", bien que swap soit préféré pour le cas à deux éléments.

+1

+1 pour être applicable aux chaînes plus grandes. – GManNickG

+1

+1 pour être général plutôt que spécifique. – Jookia

+1

+1 pour être la meilleure réponse pour les chaînes complètes –

2

Bien sûr, std :: swap serait la bonne chose à faire ici, comme l'a souligné GMan. Mais permettez-moi de vous expliquer le problème avec votre code:

string tmpStr("ab"); 
const char& tmpChar = tmpStr[0]; 
tmpStr[0] = tmpStr[1]; 
tmpStr[1] = tmpChar; 

tmpChar est en fait une référence à tmpStr [0]. Alors, voici ce qui va se passer:

| a | b | (initial content, tmpChar refers to first character) 
| b | b | (after first assignment) 

Notez que depuis tmpChar se réfère au premier caractère, il évalue maintenant à « b » et la seconde affectation ne effectivly rien:

| b | b | (after second assignment) 

Si vous supprimez le & et faites de tmpChar une variable de caractère réelle, cela fonctionnera.

0

Si vous avez besoin pour obtenir les caractères un par un, utilisez un itérateur de Revers comme indiqué here

// string::rbegin and string::rend 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("now step live..."); 
    string::reverse_iterator rit; 
    for (rit=str.rbegin() ; rit < str.rend(); rit++) 
    cout << *rit; 
    return 0; 
} 

HTH

Mario

1

Look at this :)

tmpStr[0] ^= tmpStr[1]; 
tmpStr[1] ^= tmpStr[0]; 
tmpStr[0] ^= tmpStr[1]; 

Explication:

The XOR operator has the property: (x^y)^y = x 
Let's we have a,b: 

1 => a^b,b 
2 => a^b,b^a^b=a 
3 => a^b^a=b,a 

The result is b,a. 
+1

+1 si vous expliquez pourquoi cela fonctionne – Marlon

+2

Ne le faites pas réellement. C'est plus lent sur les processeurs modernes, et moche. – GManNickG

Questions connexes