[解決済み] 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
.
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] C++で配列はどのように使うのですか?