ページ 1 / 1
文字列を逆にするプログラム
Posted: 2015年7月29日(水) 10:48
by tak2929
コード:
#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の中身がフフフフに変わっています。
原因と解決策をご教示いただけないでしょうか。
よろしくお願いします。
Re: 文字列を逆にするプログラム
Posted: 2015年7月29日(水) 11:15
by みけCAT
str_revは静的でないローカル変数なので、reverse関数を抜けた瞬間に内容は消滅します(保証されなくなります)。
とりあえず、str_revの宣言を
コード:
static char str_rev[16];
としてみてください。
オフトピック
'\0'を格納する位置が決め打ちされているのと、reverse関数内で変更されない引数strの型がconst char*ではなくchar*なのも若干気になりますが…まあいっか。
Re: 文字列を逆にするプログラム
Posted: 2015年7月29日(水) 13:01
by Tatu
引数の文字列を変更するようにするか、
受取先の文字列、反転させたい文字列の2つの引数をとって
受取先の文字列が反転させた文字列になるようにするとよいでしょう。
Re: 文字列を逆にするプログラム
Posted: 2015年7月29日(水) 23:40
by box
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;
}
Re: 文字列を逆にするプログラム
Posted: 2015年7月29日(水) 23:52
by Rittai_3D
せっかく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;
}
とか。
コンパイルはしていません。