文字反転処理
文字反転処理
#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();
}
黒い部分の答えを教えてください
教えてくれる人だけレスください
#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();
}
黒い部分の答えを教えてください
教えてくれる人だけレスください
Re: 文字反転処理
丸投げは禁止です。
ということを教えました。
コードはcodeタグで囲みましょう。
ということを教えました。
コードはcodeタグで囲みましょう。
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字反転処理
#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の先頭
上はなにをする文なんですか?
Re: 文字反転処理
具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 文字反転処理
先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 文字反転処理
このコードを日本語化すると
pDataInにaDataInのMAX_WARD番目の要素をchar*型として無理やり代入
pDataOutにaDataOutのnStrlength番目の要素をchar*型として無理やり代入
まず、aDataInの最終文字の位置とaDataOutの先頭の位置を数値もしくは変数で表すと何になりますか?
box さんが書きました:具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
それから、これについても考えてみましたか?box さんが書きました:先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
考えてわからないのであれば、どういったところが分からないのかを教えてください。
アルゴリズムというのはすべて人の考えに基づいています。
ですので、まずはその考えを理解する必要があります。
その理解なしにアルゴリズム、プログラムは出てこないと考えてください。
もし考えを理解できてアルゴリズムも出てきたとして、そこからプログラムが出てこない場合はプログラミング力不足・基礎力不足です。
この場合はしっかりと基礎について改めましょう。
我々はそれらのお手伝いをいたします。
Re: 文字反転処理
aDataIn[0] = a;
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
[code = c]
pDataIn = aDataIn[nStrlenght + 1]; nStrlenghtが文字数なのでそれにヌル文字を足したnStrlenght+\0が最終文字位置だと思いました。
pDataOut = aDataOut[0];
[/code]
aDataOutは初期化していないのにどうやってアドレスを入れるのかがわかりません。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 文字反転処理
そうですね。そのようになります。
この時のnStrlengthの値はどうなるでしょう?
また、逆順にaDataOutに入れていくとき、aDataOutの先頭にどの値からどの向きに入れていく必要がありますか?(*1)
元のプログラムに準じた形で考えてみて下さい。
それから、aDataIn[nStrlength + 1]の時にどの要素を指すか、上の具体例("abcde"とその時のnStrlength)で考えてみてください。
ちなみに、ここで言う最終文字位置は\0の一つ前の要素となります。(これは*1の考えに基づきます。)
aDataOutは確かに初期化されていませんが、確保はされていますので問題ありません。
ある変数aとして、その変数が確保されたアドレスを求めるにはどのようにしたらよいでしょう?
また、それを利用するとaDataOut[0]のアドレスも求まります。(糖衣構文的な物もありますが・・・)
Re: 文字反転処理
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]のアドレス
aDataOutに入れるときはaDataInの最終文字から入れていくので
pDataIn = (char*)aDataIn[nStrlength]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
[/code]
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 文字反転処理
配列とポインタに対しての理解が完全でないように思います。
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の先頭の要素はaDataOut[0]ではなかったですか?
また、aDataInの最終文字を具体的に言うとどのようになりますか?
上の例の時の実際の文字とその時の添え字でお答えください。
Re: 文字反転処理
>>また、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';
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 文字反転処理
ループ終了時のaDataOutは次のようになっている必要があります。 もし、最終文字を\0として上記のプログラムに当てはめると次のようになります。
aDataOut[0] = '\0'
aDataOut[1] = 'e'
aDataOut[2] = 'd'
aDataOut[3] = 'c'
aDataOut[4] = 'b'
aDataOut[5] = 'a'
以下を参考にしてください
[hr][追記]
やはりアルゴリズムの部分についてはこれに尽きます。box さんが書きました: 具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
手順を考えてみてください。
abcdeを紙に書いて、それを各文字で切り、それを先頭からedcbaの順番になるように並び替えてみてください。
最初に選択する文字はどれでしょう?
Re: 文字反転処理
pDataInのアドレスをin、pDataOutのアドレスをoutで表示しています。 *のほうはそのアドレスに入っている文字です。
この状態で ■■■■■= *pDataIn; を行うと
こうなります。
pDataIn --; pDataOut ++; により
こうなり、また ■■■■■= *pDataIn; を行うと
こうなります。
答えはみけCATさんが最初に書かれていると思われますが。
ちなみに pDataIn は nStrlength-1 としないといけません。
pDataIn = &aDataIn[nStrlength]; としてしまうと こうなってしまい *pDataOut の最初の文字が '\0' になってしまい何も表示されません。
+-----------------------+
| | | | |in | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out| | | | | | // pDataOut
+-----------------------+
| | | | | | | // *pDataOut
+-----------------------+
+-----------------------+
| | | | |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
+-----------------------+
+-----------------------+
| | | |in | | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
| |out| | | | | // pDataOut
+-----------------------+
| e | d | | | | | // *pDataOut
+-----------------------+
答えはみけCATさんが最初に書かれていると思われますが。
ちなみに pDataIn は nStrlength-1 としないといけません。
pDataIn = &aDataIn[nStrlength]; としてしまうと こうなってしまい *pDataOut の最初の文字が '\0' になってしまい何も表示されません。
Re: 文字反転処理
#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: 文字反転処理
#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);
}
へんな文字がはいってしまったのでもう一度
Re: 文字反転処理
配列でもやってることは同じですが、ポインタの課題だと思われるのでポインタで回答したほうが良いかも。
#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();
}