1. ホーム
  2. c++

[解決済み] char 配列を用いた文字列の逆引き C++

2022-02-15 06:19:01

質問

文字列を反転させる簡単なC++プログラムを書きました。文字列を文字配列に格納します。文字列を反転させるために、同じ文字配列とtemp変数を使って、配列の文字を入れ替えています。

#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文字列を結果として得ています。

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

どのように解決するのですか?

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 .