文字列を逆にするプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tak2929

文字列を逆にするプログラム

#1

投稿記事 by tak2929 » 8年前

コード:

#include <iostream>
#include <cstring>
using namespace std;

char* reverse(char* str)
{
	int num =strlen(str);
	char str_rev[16];
	for(int i=num-1;i>=0;i--)
	{
		str_rev[num-1-i]=str[i];
	}
	str_rev[15]='\0';
	return str_rev;
}

int main()
{
	char* str_test=reverse("This is a test.");
	cout << str_test << "\n";
}
文字列を逆順にするために上記コードを書いたのですが、コンソールの出力がフフフフとなってしまいます。
デバッガで見ると
char* str_test=reverse("This is a test.");まではうまくいっているようですが、
cout << str_test << "\n";str_testの中身がフフフフに変わっています。
原因と解決策をご教示いただけないでしょうか。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列を逆にするプログラム

#2

投稿記事 by みけCAT » 8年前

str_revは静的でないローカル変数なので、reverse関数を抜けた瞬間に内容は消滅します(保証されなくなります)。
とりあえず、str_revの宣言を

コード:

	static char str_rev[16];
としてみてください。
オフトピック
'\0'を格納する位置が決め打ちされているのと、reverse関数内で変更されない引数strの型がconst char*ではなくchar*なのも若干気になりますが…まあいっか。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 文字列を逆にするプログラム

#3

投稿記事 by Tatu » 8年前

引数の文字列を変更するようにするか、
受取先の文字列、反転させたい文字列の2つの引数をとって
受取先の文字列が反転させた文字列になるようにするとよいでしょう。

box
記事: 2002
登録日時: 13年前

Re: 文字列を逆にするプログラム

#4

投稿記事 by box » 8年前

tak2929 さんが書きました:

コード:

	char str_rev[16];
	str_rev[15]='\0';
決め打ちはまずいでしょう。

こんな感じ?

コード:

#include <iostream>
#include <cstring>

using namespace std;

void reverse(char *str)
{
    int len = strlen(str);

    for (int i = 0; i < len / 2; i++) {
        char t;

        t = str[i], str[i] = str[len - 1 - i], str[len - 1 - i] = t;
    }
}

int main(void)
{
    char str[] = "This is a test.";

    reverse(str);
    cout << str << "\n";
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Rittai_3D
記事: 525
登録日時: 11年前

Re: 文字列を逆にするプログラム

#5

投稿記事 by Rittai_3D » 8年前

せっかくC++で書いているなら

コード:

#include <iostream>
#include <algorithm>

std::string rev( std::string s )
{
    std::reverse( s.begin(), s.end() );
    return s;
}


int main()
{
    auto src = std::string { "This is a test."  };
    auto dst = rev( src );

    std::cout << src << std::endl;
    std::cout << dst << std::endl;
}
とか。
コンパイルはしていません。
初心者です

閉鎖

“C言語何でも質問掲示板” へ戻る