Reverse Ssortingng C ++ en utilisant char array

J’ai écrit un simple programme C ++ pour inverser une chaîne. Je stocke une chaîne dans un tableau de caractères. Pour inverser une chaîne, j’utilise le même tableau de caractères et la même variable temp pour échanger les caractères d’un tableau.

#include #include using namespace std; void reverseChar(char* str); char str[50],rstr[50]; int i,n; int main() { cout<<"Please Enter the String: "; cin.getline(str,50); reverseChar(str); cout<<str; return 0; } void reverseChar(char* str) { for(i=0;i<sizeof(str)/2;i++) { char temp=str[i]; str[i]=str[sizeof(str)-i-1]; str[sizeof(str)-i-1]=temp; } } 

Maintenant, cette méthode ne fonctionne pas et je reçois la chaîne NULL comme résultat après l’exécution du programme.

Je veux donc savoir pourquoi je ne peux pas assimiler un tableau de caractères, pourquoi ce programme ne fonctionnerait-il pas. Et quelle est la solution ou le truc que je peux utiliser pour faire fonctionner le même programme?

sizeof(str) ne fait pas ce que vous attendez.

Avec un caractère char *str , sizeof(str) ne vous donnera pas la longueur de cette chaîne. Au lieu de cela, il vous donnera le nombre d’octets qu’un pointeur occupe. Vous recherchez probablement strlen() place.

Si nous corrigions cela, nous aurions:

 for(i=0;i 

C ++, utilisez std::swap()

En C ++, si vous souhaitez échanger le contenu de deux variables, utilisez std::swap place de la variable temporaire.

Donc au lieu de:

 char temp=str[i]; str[i]=str[strlen(str)-i-1]; str[strlen(str)-i-1]=temp; 

Vous voudriez juste écrire:

 swap(str[i], str[sizeof(str) - i - 1]); 

Notez combien cela est plus clair.

Vous utilisez C ++, utilisez simplement std::reverse()

 std::reverse(str, str + strlen(str)); 

Variables globales

Il est extrêmement peu pratique de rendre les variables globales si elles n’ont pas besoin de l'être. En particulier, je parle de i à ce sujet.

Résumé

Si je devais écrire cette fonction, elle ressemblerait à l'une des deux implémentations suivantes:

 void reverseChar(char* str) { const size_t len = strlen(str); for(size_t i=0; i 

Une fois testés, ils produisent dlrow olleh sur une entrée de hello world .

Le problème est que, dans votre fonction, str n’est pas un tableau, mais un pointeur. Ainsi, sizeof vous donnera la taille du pointeur, pas la longueur du tableau pointé. En outre, même si cela vous donnait la taille du tableau, ce n’est pas la longueur de la chaîne. Pour cela, mieux utiliser strlen .

Pour éviter les appels multiples à strlen , donnez à la fonction un autre paramètre, qui indique la longueur:

 void reverseChar(char* str, int len) { for(i=0; i 

et appelez avec

reverseChar(str, strlen(str))

Une autre amélioration, comme mentionné dans les commentaires, consiste à utiliser std::swap dans le corps de la boucle:

 void reverseChar(char* str, int len) { for(i=0; i 

En outre, il y a std::reverse qui fait presque exactement cela.

 //reverse a ssortingng #include using namespace std; int strlen(char * str) { int len = 0; while (*str != '\0') { len++; str++; } return len; } void reverse(char* str, int len) { for(int i=0; i 

Si j’étais vous, je l’écrirais simplement ainsi:

 int main() { ssortingng str; cout << "Enter a string: " << endl; getline(cin, str); for (int x = str.length() - 1; x > -1; x--) { cout << str[x]; } return 0; } 

C'est un moyen très simple de le faire et fonctionne très bien.

 #include  #include  using namespace std; int main() { char str[80]; cout << "Enter a string bro: \n"; gets_s(str); for (int i = strlen(str) - 1; i > -1; i--) { cout << str[i]; } }