web-dev-qa-db-fra.com

Reverse String 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<iostream>
#include<string>
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?

13
StackPointer

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

Étant donné un 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() à la place.

Si nous corrigions cela, nous aurions:

for(i=0;i<strlen(str)/2;i++)
{
    char temp=str[i];
    str[i]=str[strlen(str)-i-1];
    str[strlen(str)-i-1]=temp;
}

C++, utilisez std::swap()

En C++, si vous souhaitez échanger le contenu de deux variables, utilisez std::swap à la 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<len/2; i++)
        swap(str[i], str[len-i-1]);
}

void reverseChar(char* str) {
    std::reverse(str, str + strlen(str));
}

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

44
Bill Lynch