web-dev-qa-db-ja.com

文字配列を使用した逆文字列C ++

文字列を逆にする簡単なC++プログラムを作成しました。文字配列を文字配列に保存します。文字列を逆にするには、同じ文字配列と一時変数を使用して配列の文字を交換しています。

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

現在、このメソッドは機能せず、プログラムの実行後に結果としてNULL文字列を取得しています。

それで、なぜ文字配列を同等にできないのか、なぜこのプログラムが機能しないのかを知りたいのです。そして、同じプログラムを機能させるために使用できる解決策やトリックは何ですか?

13
StackPointer

sizeof(str)は期待したことを行いません。

_char *str_を指定すると、sizeof(str)はその文字列の長さを提供しません。代わりに、ポインターが占有するバイト数を提供します。おそらく strlen() を探しているでしょう。

それを修正した場合、次のようになります。

_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++です。 std::swap() を使用します

C++では、2つの変数の内容を交換する場合は、一時変数の代わりに _std::swap_ を使用します。

代わりに:

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

あなたはただ書くでしょう:

_swap(str[i], str[sizeof(str) - i - 1]);
_

それがどれほど明確であるかに注意してください。

C++を使用している場合は、 std::reverse() を使用します

_std::reverse(str, str + strlen(str));
_

グローバル変数

変数が必要でない場合、変数をグローバルにすることは非常に悪い習慣です。特に、これについてはiを参照しています。

エグゼクティブサマリー

この関数を記述する場合、次の2つの実装のいずれかになります。

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

テストすると、これらは両方とも_dlrow olleh_の入力で_hello world_を生成します。

44
Bill Lynch

問題は、関数内でstrが配列ではなくポインターであることです。したがって、sizeofは、ポインターのサイズではなく、ポインターのサイズを取得します。また、配列のサイズを指定しても、それは文字列の長さではありません。これには、strlenを使用することをお勧めします。

strlenへの複数の呼び出しを回避するには、長さを示す別のパラメーターを関数に指定します。

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

そしてそれを呼び出す

reverseChar(str, strlen(str))

コメントで述べたように、ループ本体で_std::swap_を使用することも別の改善点です。

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

また、 _std::reverse_ があり、ほぼ正確にそれを行います。

0
leemes