inverser une chaîne de caractères en utilisant les pointeurs
Je dois l'avouer, je n'ai aucune idée de comment utiliser les pointeurs, mais j'ai essayé d'autres moins. le problème avec mon programme, c'est qu'il montre la chaîne dans le sens inverse, sauf pour ce qui était de la première lettre étant absent et l'ensemble de la chaîne est déplacé d'une case en avant avec le premier élément étant vide.
par exemple, il show "olle" lors de la saisie de "bonjour".
#include <iostream>
#include <string>
using namespace std;
string reverse(string word);
int main()
{
char Cstring[50];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}
string reverse(string word)
{
char *front;
char *rear;
for (int i=0;i< (word.length()/2);i++)
{
front[0]=word[i];
rear[0]=word[word.length()-i];
word[i]=*rear;
word[word.length()-i]=*front;
}
return word;
}
Le nouveau code fonctionne parfaitement. changé les cordes de cstring. la question techniquement demandé cstring mais je trouve que les chaînes de plus facile donc je travaille avec des cordes, puis faire le nécessaire changements pour le rendre c de la chaîne. compris ho pour initialiser l'arrière et à l'avant ainsi.
#include <iostream>
#include <cstring>
using namespace std;
string reverse(char word[20]);
int main()
{
char Cstring[20];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}
string reverse(char word[20])
{
char a='a';
char b='b';
char *front=&a;
char *rear=&b;
for (int i=0;i< (strlen(word)/2);i++)
{
front[0]=word[i];
rear[0]=word[strlen(word)-1-i];
word[i]=*rear;
word[strlen(word)-1-i]=*front;
}
return word;
}
char
pointeurs que vous n'avez pas initialisé, front
et rear
.Vous n'avez pas la mémoire allouée pour
front
et rear
, de sorte que vous êtes en invoquant un comportement indéterminé lors de l'utilisation de front[0]
et rear[0]
. En dehors de cela, le dernier indice de la parole est word[word.length() - 1]
et vous devez l'utiliser word[word.length() - 1 - i]
.alors, que dois-je initialiser à, tous les anciens de caractère ou de quelque chose de spécifique, comme je l'ai dit je suis tout à fait nouveau pour les pointeurs.
"je n'ai aucune idée de comment utiliser les pointeurs" — bon, ici cette planète a besoin de moins de pointeurs et plus sain d'esprit, de l'homme-un code lisible. Veuillez aider le monde à éradiquer les pointeurs en refusant de les apprendre.
ok. je vois, je pense. donc, fondamentalement, je suis en train de t non nulle élément dans word.
OriginalL'auteur user2420395 | 2013-06-19
Vous devez vous connecter pour publier un commentaire.
puis plus tard
Pas bon. Un déréférencement de pointeurs non initialisés invoque un comportement indéfini.
En dehors de cela, votre code est trop compliqué, il appelle
strlen()
lors de chaque itération (et même plusieurs fois), ce qui est superflu, et que le swap logique est aussi inutilement complexe. Essayez d'utiliser deux pointeurs au lieu de cela, votre code sera plus propre:La chose est, cependant, qu'en C++, il y a rarement une bonne raison pour en utilisant des pointeurs. Comment sur l'utilisation de
std::reverse()
à la place?front
etrear
été corrigé dans la deuxième édition de la question, mais c'est ... intéressant de code, dirons-nous. Et de l'abus destrlen()
est assez flagrant.Merci. Yap, et je ne voulais même pas parler de l'illisible en dehors de l'espace de codage de style, ce qui n'est pas strictement une erreur technique, mais encore rend le code look très professionnel.
OriginalL'auteur
OriginalL'auteur stewart99
vous pouvez aussi faire comme ceci:
il fonctionne avec succès sur mon système ,c'est à dire sur emacs+gcc sur windows 7
front[0]
vs*front
etrear[0]
vs*rear
. Cela ne change pas la fonction du code; seulement la nomenclature est différent. Je ne suis pas sûr de savoir pourquoi vous attendez d'un crédit, pour elle, donc. Il n'est même pas un très bon algorithme. Il y a beaucoup trop d'utilisations destrlen()
à être sensible. La meilleure solution à l'aide de pointeurs C est beaucoup plus simple.Cela signifie que je n'ait pas vu les modifier, à l'époque ou je n'aurais pas prêté attention à elle, à cette époque, il y avait des problèmes importants comme vous pouvez le voir, l'OP n'a pas initialisé avant et à l'arrière des variables à l'époque,et comme vous pouvez le voir, le mien était la seule réponse que j'ai donc pensé que d'accepter de ne pas faire de mal, mais maintenant les autres "meilleure" réponse est disponible , je ne vais pas s'attendre à quelque crédit que ce soit.Il ne peut être porté atteinte que les nouveaux utilisateurs ici l'envie de "réputation" de sorte que c'était ma cause.Si vous vous sentez le mien n'est pas très bonne réponse,vous êtes assez bon pour bas de vote!
OriginalL'auteur 0decimal0