スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに

私たちは、言葉を逆に順序で読むことがあります。たとえば、「てぶくろ」を「ろくぶて」と読むことです。これは、「倒語」(とうご)と呼ばれます。

プログラムで、文字列を逆順に並べ替える必要性があるのかどうかはわかりませんが、文字列を逆順にする方法を考えてみました。

今回は、C言語での実装を考えてみます。

C言語で文字列を逆に並べ替える方法


メモリの内容を逆に並べ替えるには、低位メモリと高位メモリの内容を入れ替えていくことで可能です。

char str[] = "hoge";

上記の文字列があったときに、以下の手順を行います。
str[0] と str[3] を入れ替えます。
str[1] と str[2] を入れ替えます。
これで、全部入れ替えが完了です。

文字列の文字を1つ1つ、添え字で入れ替えるプログラムを書くのは大変です。


もっと簡単に実現する方法は、ループを回して、先頭と最後の両方から文字列の真ん中を目指しながら、文字を置き換えていくことです。メモリの内容を逆順に並べ替えるには、下記のプログラムで並べ替えることが可能です。

文字列の最初と文字列の最後の文字のポインタを渡します。
int
reverse(char *start, char *end)
{
	char t = 0;
	while (start < end)
	{
		t = *end;
		*end-- = *start;
		*start++ =t;
	}
	return (0);
}

2つの変数の中身を入れ替える場合は、たいてい、もう1つのテンポラリーの変数が必要になります。上記の例では、ポインタをインクリメントとデクリメントをしていますが、添え字用の変数を2つ使って実装しても構いません。そのあたりは、好みだと思います。

文字列の内容を逆順に並べ替えるには、下記の関数に渡すことで可能です。
int strreverse(char *start)

文字列の先頭のポインタを関数に渡します。関数内では、文字列の長さを strlen で調べ、文字列の最後の文字のポインタを取得します。そして、前述の reverse() を呼び出します。
int
strreverse(char *start)
{
	char *end = & start [ strlen(start) - 1 ];
	return reverse(start, end);
}


サンプルコード


C言語での実装例を以下に示します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
reverse(char *start, char *end)
{
	char t = 0;
	if(!start || !end)
	{
		return (-1);
	}
	while (start < end)
	{
		t = *end;
		*end-- = *start;
		*start++ =t;
	}
	return (0);
}

int
strreverse(char *start)
{
	if(! start)
	{
		return (-1);
	}
	char *end = & start [ strlen(start) - 1 ];
	return reverse(start, end);
}

void
reverse_test(char *str)
{
	printf ("%s => ", str);
	strreverse (str);
	printf ("%s\n", str);
}

int
main (int argc, char *argv[])
{
	char b1[32] = "";
	char b2[32] = "ab";
	char b3[32] = "321";
	char b4[32] = "4321";

	reverse_test ( b1 );
	reverse_test ( b2 );
	reverse_test ( b3 );
	reverse_test ( b4 );

	strreverse (NULL);
	reverse (NULL, NULL);

	exit (EXIT_SUCCESS);
}

実行例


実行結果は以下のようになります。空の文字列を渡した場合は、なにもしません。文字の長さが長くなっても、問題なく入れ替えが行われていることが確認できました。
% cc strreverse.c
% ./a.out
 => 
ab => ba
321 => 123
4321 => 1234

最後に

C言語で、文字列を逆にするサンプルプログラムを書いてみましたが、いまいち使いどころが思いつきませんでした。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー