文字反転処理

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

文字反転処理

#1

投稿記事 by 困り果てた大地 » 12年前

#i[tab=30]nclude <stdio.h>
#include <string.h>

#define MAX_WARD 256

void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD]; //反転前文字列入力先
char aDataOut[MAX_WARD]; //反転後文字列格納先
char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
int nStrlength; //入力文字数
int nLoopCntWord; //反転処理ループ用

printf("何か文字を入力してください(255文字以内)>");
scanf("%s", &aDataIn);

nStrlength = (int)strlen(aDataIn);
printf("\マークn文字数は「%d」文字です。\n", nStrlength);

//===文字列の反転処理===
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
for( nLoopCntWord = 0; nLoopCntWord < ■■■■; nLoopCntWord ++)
{
■■■■■■ = *pDataIn;

pDataIn --;
pDataOut ++;
}
■■■■■■ = '\0';

printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);

rewind(stdin);
getchar();
}


黒い部分の答えを教えてください
教えてくれる人だけレスください

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

Re: 文字反転処理

#2

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

丸投げは禁止です。
ということを教えました。

コードはcodeタグで囲みましょう。
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

困り果てた大地

Re: 文字反転処理

#3

投稿記事 by 困り果てた大地 » 12年前

コード:

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

#define MAX_WARD 256

void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD]; //反転前文字列入力先
char aDataOut[MAX_WARD]; //反転後文字列格納先
char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
int nStrlength; //入力文字数
int nLoopCntWord; //反転処理ループ用

printf("何か文字を入力してください(255文字以内)>");
scanf("%s", &aDataIn);

nStrlength = (int)strlen(aDataIn);
printf("\マークn文字数は「%d」文字です。\n", nStrlength);

//===文字列の反転処理===
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
for( nLoopCntWord = 0; nLoopCntWord < ■■■■; nLoopCntWord ++)
{
■■■■■■ = *pDataIn;

pDataIn --;
pDataOut ++;
}
■■■■■■ = '\0';

printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);

rewind(stdin);
getchar();
}



pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
上はなにをする文なんですか?

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

Re: 文字反転処理

#4

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

コード:

pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataInに■■■■■■を代入する文です。

コード:

pDataOut = ■■■■■■; //aDataOutの先頭
pDataOutに■■■■■■を代入する文です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

困り果てた大地

Re: 文字反転処理

#5

投稿記事 by 困り果てた大地 » 12年前

コード:

 
pDataIn = aDataIn; 
pDataOut = aDataIn;
違いますよね・・・

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

Re: 文字反転処理

#6

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

コメント通りのことを書けばいいです。

コード:

pDataIn = aDataIn の最終文字位置のポインタ; //aDataIn の最終文字位置
pDataOut = aDataOutの先頭のポインタ; //aDataOutの先頭
もちろんこのままではコンパイルは通りませんよ。念のため。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

困り果てた大地

Re: 文字反転処理

#7

投稿記事 by 困り果てた大地 » 12年前

コード:

pDataIn  = (char*)aDataIn[nStrlength];
pDataOut = (char*)aDataOut[nStrlength-nStrlength];
こうですか?わかりません

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

Re: 文字反転処理

#8

投稿記事 by box » 12年前

具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

困り果てた大地

Re: 文字反転処理

#9

投稿記事 by 困り果てた大地 » 12年前

<code = c>
pDataIn = ■■■■■■; //aDataIn の最終文字位置
</code>
ここだけ教えてもらえませんか・・・

困り果てた大地

Re: 文字反転処理

#10

投稿記事 by 困り果てた大地 » 12年前

<code = C>
pDataIn = ■■■■■■; //aDataIn の最終文字位置
</code>
ここだけ教えてもらえませんか・・・

困り果てた大地

Re: 文字反転処理

#11

投稿記事 by 困り果てた大地 » 12年前

2回も間違えましたすみません

コード:

pDataIn = ■■■■■■; //aDataIn の最終文字位置
ここだけ教えてもらえませんか・・・

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

Re: 文字反転処理

#12

投稿記事 by box » 12年前

先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

困り果てた大地

Re: 文字反転処理

#13

投稿記事 by 困り果てた大地 » 12年前

コード:

pDataIn  = (char*)aDataIn[MAX_WARD];     //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength];  //aDataOutの先頭
・・・

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 文字反転処理

#14

投稿記事 by bitter_fox » 12年前

困り果てた大地 さんが書きました:

コード:

pDataIn  = (char*)aDataIn[MAX_WARD];     //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength];  //aDataOutの先頭
このコードを日本語化すると

コード:

pDataInにaDataInのMAX_WARD番目の要素をchar*型として無理やり代入
pDataOutにaDataOutのnStrlength番目の要素をchar*型として無理やり代入
となってしまいます。
まず、aDataInの最終文字の位置とaDataOutの先頭の位置を数値もしくは変数で表すと何になりますか?
box さんが書きました:具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
box さんが書きました:先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
それから、これについても考えてみましたか?
考えてわからないのであれば、どういったところが分からないのかを教えてください。

アルゴリズムというのはすべて人の考えに基づいています。
ですので、まずはその考えを理解する必要があります。
その理解なしにアルゴリズム、プログラムは出てこないと考えてください。

もし考えを理解できてアルゴリズムも出てきたとして、そこからプログラムが出てこない場合はプログラミング力不足・基礎力不足です。
この場合はしっかりと基礎について改めましょう。
我々はそれらのお手伝いをいたします。

困り果てた大地

Re: 文字反転処理

#15

投稿記事 by 困り果てた大地 » 12年前

コード:

aDataIn[0] = a; 
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
abcdeと入力されたら配列の各要素に入る値はこうでしょうか


[code = c]
pDataIn = aDataIn[nStrlenght + 1]; nStrlenghtが文字数なのでそれにヌル文字を足したnStrlenght+\0が最終文字位置だと思いました。
pDataOut = aDataOut[0];
[/code]
aDataOutは初期化していないのにどうやってアドレスを入れるのかがわかりません。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 文字反転処理

#16

投稿記事 by bitter_fox » 12年前

困り果てた大地 さんが書きました:

コード:

aDataIn[0] = a; 
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
abcdeと入力されたら配列の各要素に入る値はこうでしょうか

コード:

pDataIn = aDataIn[nStrlenght + 1];  nStrlenghtが文字数なのでそれにヌル文字を足したnStrlenght+\0が最終文字位置だと思いました。
そうですね。そのようになります。
この時のnStrlengthの値はどうなるでしょう?
また、逆順にaDataOutに入れていくとき、aDataOutの先頭にどの値からどの向きに入れていく必要がありますか?(*1)
元のプログラムに準じた形で考えてみて下さい。

それから、aDataIn[nStrlength + 1]の時にどの要素を指すか、上の具体例("abcde"とその時のnStrlength)で考えてみてください。

ちなみに、ここで言う最終文字位置は\0の一つ前の要素となります。(これは*1の考えに基づきます。)
困り果てた大地 さんが書きました:

コード:

pDataOut = aDataOut[0];  
aDataOutは初期化していないのにどうやってアドレスを入れるのかがわかりません。
aDataOutは確かに初期化されていませんが、確保はされていますので問題ありません。

ある変数aとして、その変数が確保されたアドレスを求めるにはどのようにしたらよいでしょう?
また、それを利用するとaDataOut[0]のアドレスも求まります。(糖衣構文的な物もありますが・・・)

困り果てた大地

Re: 文字反転処理

#17

投稿記事 by 困り果てた大地 » 12年前

コード:

aDataIn[0] = a; 
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
nStrlenghtの値は「5」
aDataIn[nStrlength + 1]だとaDataIn[5]のアドレス
[code = C]
aDataOutに入れるときはaDataInの最終文字から入れていくので
pDataIn = (char*)aDataIn[nStrlength]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
[/code]

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 文字反転処理

#18

投稿記事 by bitter_fox » 12年前

困り果てた大地 さんが書きました:

コード:

aDataIn[0] = a; 
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
nStrlenghtの値は「5」
aDataIn[nStrlength + 1]だとaDataIn[5]のアドレス
配列とポインタに対しての理解が完全でないように思います。
http://www.geocities.jp/ky_webid/c/023.html
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html

上の場合、aDataIn[0]としたときは'a'となります。
アドレスを求めるには&演算子を用います。
http://masudahp.web.fc2.com/cl/kiso/ck03.html

また、nStrlengthの値が5なのでaDataIn[nStrlength + 1]はaDataIn[5 + 1]となりaDataIn[6]となります。
ですので、aDataIn[nStrlength + 1]は\0の次の要素となります。
困り果てた大地 さんが書きました:

コード:

aDataOutに入れるときはaDataInの最終文字から入れていくので
pDataIn  = (char*)aDataIn[nStrlength];							//aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength];							//aDataOutの先頭
aDataOutの先頭の要素はaDataOut[0]ではなかったですか?
また、aDataInの最終文字を具体的に言うとどのようになりますか?
上の例の時の実際の文字とその時の添え字でお答えください。

困り果てた大地

Re: 文字反転処理

#19

投稿記事 by 困り果てた大地 » 12年前

>>また、aDataInの最終文字を具体的に言うとどのようになりますか?
>>上の例の時の実際の文字とその時の添え字でお答えください。

コード:

aDataInの最終文字はaDataIn[5] = \0

pDataOut = aDataOut[0]//先頭文字 でやるとエラーがでてしまいます。
ちなみにこんな書き方
	pDataIn  = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置
	pDataOut = (char*)aDataOut[0];//aDataOutの先頭
	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		//■■■■ = *pDataIn;
		pDataIn  --;
		pDataOut ++;
	}
	*(aDataOut + nStrlength) = '\0';	

困り果てた大地

Re: 文字反転処理

#20

投稿記事 by 困り果てた大地 » 12年前

コード:

 
	pDataIn  = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置 
	pDataOut = (char*)&aDataOut[0];	//aDataOutの先頭文字位置
	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		//■■■■ = *pDataIn;	

		pDataIn  --;
		pDataOut ++;	
	}
	*(aDataOut + nStrlength) = '\0';
上記でやったらエラーなくできました

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 文字反転処理

#21

投稿記事 by bitter_fox » 12年前

困り果てた大地 さんが書きました:>>また、aDataInの最終文字を具体的に言うとどのようになりますか?
>>上の例の時の実際の文字とその時の添え字でお答えください。

コード:

aDataInの最終文字はaDataIn[5] = \0


	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		//■■■■ = *pDataIn;
		pDataIn  --;
		pDataOut ++;
	}
	*(aDataOut + nStrlength) = '\0';	
ループ終了時のaDataOutは次のようになっている必要があります。

コード:

aDataOut[0] = 'e'
aDataOut[1] = 'd'
aDataOut[2] = 'c'
aDataOut[3] = 'b'
aDataOut[4] = 'a'
もし、最終文字を\0として上記のプログラムに当てはめると次のようになります。

コード:

aDataOut[0] = '\0'
aDataOut[1] = 'e'
aDataOut[2] = 'd'
aDataOut[3] = 'c'
aDataOut[4] = 'b'
aDataOut[5] = 'a'
困り果てた大地 さんが書きました:

コード:

pDataOut = aDataOut[0]//先頭文字 でやるとエラーがでてしまいます。
ちなみにこんな書き方
	pDataIn  = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置
	pDataOut = (char*)aDataOut[0];//aDataOutの先頭
以下を参考にしてください
[hr][追記]
box さんが書きました: 具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
やはりアルゴリズムの部分についてはこれに尽きます。
手順を考えてみてください。
abcdeを紙に書いて、それを各文字で切り、それを先頭からedcbaの順番になるように並び替えてみてください。
最初に選択する文字はどれでしょう?

困り果てた大地

Re: 文字反転処理

#22

投稿記事 by 困り果てた大地 » 12年前

コード:

for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
    {
        //■■■■ = *pDataIn;
        pDataIn  --;
        pDataOut ++;
    }

//■■■■ = *pDataIn;
上の行はなにをする分ですか?

困り果てた大地

Re: 文字反転処理

#23

投稿記事 by 困り果てた大地 » 12年前

コード:

	pDataIn  = (char*)aDataIn [nStrlength];
	pDataOut = (char*)&aDataOut[0];
	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		■■■■■= *pDataIn;

		pDataIn  --;
		pDataOut ++;
	}
	aDataOut[nStrlength] = '\0';
宿題の提出日が今日までなんです・・・
答えを教えてくださいお願いします

hss12
記事: 40
登録日時: 12年前

Re: 文字反転処理

#24

投稿記事 by hss12 » 12年前

pDataInのアドレスをin、pDataOutのアドレスをoutで表示しています。 *のほうはそのアドレスに入っている文字です。

コード:

+-----------------------+
|   |   |   |   |in |   | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out|   |   |   |   |   | // pDataOut
+-----------------------+
|   |   |   |   |   |   | // *pDataOut
+-----------------------+
この状態で ■■■■■= *pDataIn; を行うと

コード:

+-----------------------+
|   |   |   |   |in |   | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out|   |   |   |   |   | // pDataOut
+-----------------------+
| e |   |   |   |   |   | // *pDataOut
+-----------------------+
こうなります。
pDataIn --; pDataOut ++; により

コード:

+-----------------------+
|   |   |   |in |   |   | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|   |out|   |   |   |   | // pDataOut
+-----------------------+
| e |   |   |   |   |   | // *pDataOut
+-----------------------+
こうなり、また ■■■■■= *pDataIn; を行うと

コード:

+-----------------------+
|   |   |   |in |   |   | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|   |out|   |   |   |   | // pDataOut
+-----------------------+
| e | d |   |   |   |   | // *pDataOut
+-----------------------+
こうなります。
答えはみけCATさんが最初に書かれていると思われますが。

ちなみに pDataIn は nStrlength-1 としないといけません。
pDataIn = &aDataIn[nStrlength]; としてしまうと

コード:

+-----------------------+
|   |   |   |   |   |in | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out|   |   |   |   |   | // pDataOut
+-----------------------+
|   |   |   |   |   |   | // *pDataOut
+-----------------------+
こうなってしまい *pDataOut の最初の文字が '\0' になってしまい何も表示されません。

困り果てた大地

Re: 文字反転処理

#25

投稿記事 by 困り果てた大地 » 12年前

コード:

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

#define MAX_WARD 256

void main(void)
{
	//===変数宣言===
	char aDataIn[MAX_WARD];[tab=30]//反転前文字列入力先
	char aDataOut[MAX_WARD];	[tab=30]//反転後文字列格納先
	char *pDataIn;[tab=30]//反転前配列操作用ポインタ
	char *pDataOut;[tab=30]//反転後配列操作用ポインタ
	int nStrlength;[tab=30]//入力文字数
	int nLoopCntWord;[tab=30]//反転処理ループ用

	printf("何か文字を入力してください(255文字以内)");
	scanf("%s", &aDataIn);			

	nStrlength = (int)strlen(aDataIn);
	printf("\n文字数は「%d」文字です。\n", nStrlength);

	//===文字列の反転処理===
	pDataIn  = (char*)&aDataIn [nStrlength - 1];[tab=30]//aDataIn の最終文字位置
	pDataOut = (char*)&aDataOut[0];[tab=30][tab=30]//aDataOutの先頭文字位置
	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		pDataOut[0] = *pDataIn;

		pDataIn  --;
		pDataOut ++;
	}
	aDataOut[nStrlength] = '\0';

	printf("*** 反転処理完了 ***\n");
	printf("入力した文字列:%s\n", aDataIn);
	printf("反転した文字列:%s\n", aDataOut);
}

これでできるようになりました。ありがとうございます。
pDataIn  = (char*)&aDataIn [nStrlength - 1];
pDataOut = (char*)&aDataOut[0];
ここが山場でした・・・

困り果てた大地

Re: 文字反転処理

#26

投稿記事 by 困り果てた大地 » 12年前

コード:

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

#define MAX_WARD 256

void main(void)
{
	//===変数宣言===
	char aDataIn[MAX_WARD];//反転前文字列入力先
	char aDataOut[MAX_WARD];//反転後文字列格納先
	char *pDataIn;//反転前配列操作用ポインタ
	char *pDataOut;//反転後配列操作用ポインタ
	int nStrlength;//入力文字数
	int nLoopCntWord;//反転処理ループ用


	printf("何か文字を入力してください(255文字以内)>:");
	scanf("%s", &aDataIn);

	nStrlength = (int)strlen(aDataIn);
	printf("\n文字数は「%d」文字です。\n", nStrlength);

	//===文字列の反転処理===
	pDataIn  = (char*)&aDataIn [nStrlength - 1];//aDataIn の最終文字位置
	pDataOut = (char*)&aDataOut[0];//aDataOutの先頭文字位置
	for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		pDataOut[0] = *pDataIn;

		pDataIn  --;
		pDataOut ++;
	}
	aDataOut[nStrlength] = '\0';


	printf("*** 反転処理完了 ***\n");
	printf("入力した文字列:%s\n", aDataIn);
	printf("反転した文字列:%s\n", aDataOut);
}
へんな文字がはいってしまったのでもう一度

hss12
記事: 40
登録日時: 12年前

Re: 文字反転処理

#27

投稿記事 by hss12 » 12年前

配列でもやってることは同じですが、ポインタの課題だと思われるのでポインタで回答したほうが良いかも。

コード:

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

#define MAX_WARD 256

void main(void)
{
	//===変数宣言===
	char aDataIn[MAX_WARD]; //反転前文字列入力先
	char aDataOut[MAX_WARD]; //反転後文字列格納先
	char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
	int nStrlength; //入力文字数
	int nLoopCntWord; //反転処理ループ用

	printf("何か文字を入力してください(255文字以内)>");
	scanf("%s", &aDataIn);

	nStrlength = (int)strlen(aDataIn);
	printf("\n文字数は「%d」文字です。\n", nStrlength);

	//===文字列の反転処理===
	pDataIn  = aDataIn + (nStrlength-1); //aDataIn の最終文字位置
	pDataOut = aDataOut; //aDataOutの先頭
	for( nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
	{
		*pDataOut = *pDataIn;

		pDataIn  --;
		pDataOut ++;
	}
	*pDataOut = '\0';

	printf("*** 反転処理完了 ***\n");
	printf("入力した文字列:%s\n", aDataIn);
	printf("反転した文字列:%s\n", aDataOut);

	rewind(stdin);
	getchar();
}

閉鎖

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