入力したものを反転させて出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KTN19
記事: 23
登録日時: 9年前

入力したものを反転させて出力

#1

投稿記事 by KTN19 » 9年前

質問が続いてしまいすみません.
タイトル通りのこともしたいのですが,ループ処理がうまくいかないのですがどこが間違っているのでしょうか?

コード:

#include<stdio.h>
#include<string.h>
#define N 100

void str_copy_reverse( char dst[], char src[], int size);
void get_line( char s[], int size );

int main( void )
{
	char s_in[ N ];
	char s_out[ N ];
	int len;
	
	printf( "入力せよ>>" );
	get_line( s_in, N );
	len = strlen( s_in );
	str_copy_reverse( s_out, s_in, len );
	
	printf( "%s", s_out );
	
	return 0;
}
void get_line( char s[], int size )
{
	int i, c;
	
	for( i = 0; i < size - 1; i++ )
	{
		c = getchar();
		if( c == EOF || c == '\n' ) break;
		s[ i ] = c;
	}
	s[ i ] = '\0';
}
void str_copy_reverse( char dst[], char src[], int size )
{
	int i, j;
	char tem;
	
	for( i = 0; i < size; i++ ){
		for( j = 0; j < size; j++ ){
			tem = src[ size - j ];
			dst[ i ] = src[ size - j ];
			dst[ i ] = tem;
		}
	}
	dst[ i ] = '\0';
}

かずま

Re: 入力したものを反転させて出力

#2

投稿記事 by かずま » 9年前

KTN19 さんが書きました:質問が続いてしまいすみません.
タイトル通りのこともしたいのですが,ループ処理がうまくいかないのですがどこが間違っているのでしょうか?
str_copy_reverse() ですが、src = "abc", size = 3 のとき、dst に何が入るか、
紙に書いてみれば、それが自分のやりたいことでないことはすぐにわかるでしょう。

コード:

void str_copy_reverse(char dst[], const char src[], int size)
{
    int i = 0;
    while (size > 0)
        dst[i++] = src[--size];
    dst[i] = '\0';
}

かずま

Re: 入力したものを反転させて出力

#3

投稿記事 by かずま » 9年前

「どこが間違っているのでしょうか?」と聞いているのに、
「すぐにわかるでしょう」はないだろう!と思われているかもしれないので、
ちょっと詳しく書いてみますね。

str_copy_reverse() が呼び出されたとき、

dst = ?
src = "abc" すなわち src = { 'a', 'b', 'c', '\0', ... }
size = 3

for (i = 0;、for (j = 0; を実行すると、i = 0、j = 0
size - j は 3 なので、tem = src[3] を実行し、tem = '\0'
dst[0] = src[3] を実行し、dst[0] = '\0'
dst[0] = tem を実行し、dst[0] = '\0'
ほら、ここが間違っています。

まだわからなければ、
j++ を実行し、j = 1
size - j は 2 なので、tem = src[2] を実行し、tem = 'c'
dst[0] = src[2] を実行し、dst[0] = 'c'
dst[0] = tem を実行し、dst[0] = 'c'
おお、これはやりたいことだ。

でも、さらに j++ を実行し、j = 2
size - j は 1 なので、tem = src[1] を実行し、tem = 'b'
dst[0] = src[2] を実行し、dst[0] = 'b'
dst[0] = tem を実行し、dst[0] = 'b'
やっぱり、間違っています。
dst[0] への代入がこんなに続くのも変です。

やりたいことは、
src = { 'a', 'b', 'c', '\0', ... } から、
dst = { 'c', 'b', 'a', '\0', ... } を作りたいということ。

dst[0] = src[2]
dst[1] = src[1]
dst[2] = src[0]
dst[3] = '\0'
これだけです。

src から dst への代入が 3回なので、
ひとつのループで size回まわればよいということが分かります。
あとは自分で考えてください。

KTN19
記事: 23
登録日時: 9年前

Re: 入力したものを反転させて出力

#4

投稿記事 by KTN19 » 9年前

細心にわたるご教授ありがとうございます。
一度、紙に書いてみるのも手ですね!

コード:

void str_copy_reverse( char dst[], char src[], int size )
{
	int i, j;
	char tem;
	
	for( i = 0, j = 1; i < size; i++, j++ ){
		dst[ i ] = src[ size - j ];	
	}
	dst[ i ] = '\0';
}

閉鎖

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