ページ 11

配列で文字を反転

Posted: 2015年10月22日(木) 22:18
by momon
配列を使って文字列を反転にしたいのですが、string.hを使わずに実行したいのですが、forの部分がどうすればいいのかわかりません。
手伝ってください。

コード:

#include<stdio.h>
int main(void)
{
	char a[100];
	int i, j;
	printf("文字列を入力\n");
	scanf("%s", &a);

       for()

	printf("%s\n",a);
	return 0;
}

Re: 配列で文字を反転

Posted: 2015年10月22日(木) 22:29
by box

コード:

#include <stdio.h>

int main(void)
{
    char a[100], t;
    int i, j;

    printf("文字列を入力\n");
    scanf("%s", a);

    for (i = 0; a[i]; i++)
        ;
    for (j = 0; j < i / 2; j++)
        t = a[j], a[j] = a[i - 1 - j], a[i - 1 - j] = t;
    printf("%s\n",a);
    return 0;
}

Re: 配列で文字を反転

Posted: 2015年10月22日(木) 22:32
by box
C言語以外で書いてみるなど。

コード:

puts STDIN.gets.chomp.reverse

Re: 配列で文字を反転

Posted: 2015年10月22日(木) 22:35
by momon
t = a[j], a[j] = a, a = t;
の部分はどのような意味なんですか?

Re: 配列で文字を反転

Posted: 2015年10月22日(木) 22:45
by box
momon さんが書きました:t = a[j], a[j] = a, a = t;
の部分はどのような意味なんですか?

j番目の文字と(i - 1 - j)番目の文字とを入れ替えています。

例えば、
aの中身が"abcd"であるとします。1個目のfor文で、長さを求めています。文字列の長さであるiという変数には4が入っています。
そして、
0番目('a')と3番目('d')とを入れ替えます。この時点で、aの中身は"dbca"になっています。次に
1番目('b')と2番目('c')とを入れ替えます。この時点で、aの中身は"dcba"になっています。入れ替えはこれでおしまい。
この場合、m番目とn番目を入れ替える、というときのm + nの値がiより必ず1小さいことに注意してください。

別の例
aの中身が"stuvw"であるとします。1個目のfor文で、長さを求めています。文字列の長さであるiという変数には5が入っています。
そして、
0番目('s')と4番目('w')とを入れ替えます。この時点で、aの中身は"wtuvs"になっています。次に
1番目('t')と3番目('v')とを入れ替えます。この時点で、aの中身は"wvuts"になっています。入れ替えはこれでおしまい。
この場合も、m番目とn番目を入れ替える、というときのm + nの値がiより必ず1小さいことに注意してください。

Re: 配列で文字を反転

Posted: 2015年10月22日(木) 22:53
by momon
解決しました!
丁寧な解説ありがとうございます。

Re: 配列で文字を反転

Posted: 2015年10月23日(金) 00:46
by かずま
別解

コード:

#include <stdio.h>
 
int main(void)
{
    char a[100], t;
    int i, j;
 
    printf("文字列を入力\n");
    scanf("%99s", a);
    for (i = 0; a[i]; i++)
        ;
    for (j = 0; j < --i; j++)
        t = a[j], a[j] = a[i], a[i] = t;
    printf("%s\n", a);
    return 0;
}
いかがでしょうか?
解は一つではありません。もっとほかの解答が見たいですか?