wake-up-neo.com

Reverse String C++ mit dem Char-Array

Ich habe ein einfaches C++ - Programm geschrieben, um eine Zeichenfolge umzukehren. Ich speichere eine Zeichenfolge in einem Zeichenfeld. Um eine Zeichenfolge umzukehren, verwende ich dasselbe Zeichenarray und dieselbe temporäre Variable, um die Zeichen eines Arrays auszutauschen.

#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;
    }
}

Nun funktioniert diese Methode nicht und ich erhalte nach der Programmausführung den NULL-String als Ergebnis.

Ich möchte also wissen, warum ich das Character Array nicht gleich setzen kann, warum dieses Programm nicht funktioniert. Und was ist die Lösung oder der Trick, mit dem ich dasselbe Programm zum Laufen bringen kann?

13
StackPointer

sizeof(str) macht nicht das, was Sie erwarten.

Bei einem char *str gibt sizeof(str) nicht die Länge dieser Zeichenfolge an. Stattdessen erhalten Sie die Anzahl der Bytes, die ein Zeiger belegt. Sie suchen wahrscheinlich stattdessen nach strlen() .

Wenn wir das behoben haben, hätten wir:

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;
}

Dies ist C++, verwenden Sie std::swap()

Wenn Sie in C++ den Inhalt zweier Variablen vertauschen möchten, verwenden Sie std::swap anstelle der temporären Variablen.

Also statt:

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

Sie würden einfach schreiben:

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

Beachten Sie, wie viel klarer das ist.

Sie verwenden C++, verwenden Sie einfach std::reverse()

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

Globale Variablen

Es ist äußerst mangelhaft, Variablen global zu machen, wenn dies nicht nötig ist. Ich beziehe mich hier insbesondere auf i.

Zusammenfassung

Wenn ich diese Funktion schreiben würde, würde sie wie eine der beiden folgenden Implementierungen aussehen:

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));
}

Beim Test erzeugen beide auf einer Eingabe von dlrow ollehhello world.

44
Bill Lynch

Das Problem ist, dass str in Ihrer Funktion kein Array, sondern ein Zeiger ist. Mit sizeof erhalten Sie die Größe des Zeigers und nicht die Länge des Arrays, auf das er zeigt. Auch wenn es die Größe des Arrays angibt, entspricht dies nicht der Länge der Zeichenfolge. Verwenden Sie dazu besser strlen.

Um mehrfache Aufrufe von strlen zu vermeiden, geben Sie der Funktion einen weiteren Parameter, der die Länge angibt:

void reverseChar(char* str, int len)
{
    for(i=0; i<len/2; i++)
    {
        char temp=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=temp;
    }
}

und nenne es mit

reverseChar(str, strlen(str))

Eine weitere Verbesserung, wie in den Kommentaren erwähnt, ist die Verwendung von std::swap Im Schleifenkörper:

void reverseChar(char* str, int len)
{
    for(i=0; i<len/2; i++)
    {
        std::swap(str[i], str[len-i-1]);
    }
}

Außerdem gibt es std::reverse , das fast genau das macht.

0
leemes