文字列を逆にする簡単な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文字列を取得しています。
それで、なぜ文字配列を同等にできないのか、なぜこのプログラムが機能しないのかを知りたいのです。そして、同じプログラムを機能させるために使用できる解決策やトリックは何ですか?
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;
}
_
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]);
_
それがどれほど明確であるかに注意してください。
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
_を生成します。
問題は、関数内で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
_ があり、ほぼ正確にそれを行います。