- ベストアンサー
ポインタ変数を用いた配列の反転操作。
strSrcの文字列を逆順にしてstrDstに格納し、 逆順にした文字列を表示するプログラムを自分なりに考えて、 作成したのですが、途中で行き詰ってしまいました。 src=strSrc;とdst=strDst;辺りが上手くいっていないようなので どなたかどのように記述すれば良くなるのかご教授お願いします。 また、他の問題点などもあればどうかご指摘お願いします。 #include <stdio.h> /* 文字列反転関数 引数: char *src : 反転させる文字列 char *dst : 反転させた結果を書き込む文字列 返値: なし */ void reverseStr(char *src, char *dst) { src=strSrc; dst=strDst; /*文字列の末尾を指すまでインクリメント*/ while(src != 0){ src++; } /*『配列strDstの番地の値』を『配列strSrcの番地の値』に上書き*/ while(*dst != 0){ *dst=*src; src--; dst++; } *dst=0; } /* メイン関数 引数: なし 返値: int 正常終了時 0 */ int main(void) { char strSrc[] = "abcdefghijkl" ; char strDst[] = "01234567890123456789" ; reverseStr( strSrc, strDst ) ; printf("%s\n", strDst ) ; return( 0 ); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>src=strSrc;とdst=strDst;辺りが上手くいっていないようなので 「コンパイルエラー」を理解しましょう。 ☆最初の while 文を抜けた時点での src は、0x00 の入った場所を示していませんか。 ☆短い src を、長い dst の分までデクリメントしたら・・・。 ---------------------------------------------- #include <stdio.h> void ReverseStr( char *src, char *dst ) { while( 0x00 != *src ) src++; // typo ? while( 0x00 != *dst ){ // dst で判定するなら◆ src--; // 行入れ替え▽ *dst = *src; // △ dst++; } } int main( void ) { char strSrc[] = "abcdefghijkl"; char strDst[] = "012345678901"; // ◆こちらが長くないこと printf( "%s\n", strDst ); ReverseStr( strSrc, strDst ); printf( "%s\n", strDst ); return( 0 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
> > src = strSrc; > > dst = strDst; > の部分はそのままでいいと思います すみません reverseStrの引数を見間違えておりました m(__)m
- asuncion
- ベストアンサー率33% (2127/6289)
> > src = strSrc; > > dst = strDst; > の部分はそのままでいいと思います どうしてでしょうか?何か勘違いをなさっているようですね。 もともとのコードをよ~くごらんください。 strSrc、strDstとも、main関数だけで定義していて、 外部変数ではないです。 そのままだとコンパイルエラーが出ますよ。
お礼
なるほど。 strSrc、strDstはmain関数だけで定義してるので、 外部変数ではないんですね。 コンパイルエラーは出ていたのですが、どう扱えばいいのか曖昧だったので困っておりました。 参考になりました。ありがとうございます。
- redfox63
- ベストアンサー率71% (1325/1856)
> src = strSrc; > dst = strDst; の部分はそのままでいいと思います > /*文字列の末尾を指すまでインクリメント*/ > while(src != 0){ > src++; > } ここのループ条件も変ですね srcと書いただけでは ポインタのアドレスですので *srcとするほうがいいでしょう この後ループで使うことを考えるなら *(src+1) といった条件の方がいいかもしれません > /*『配列strDstの番地の値』を『配列strSrcの番地の値』に上書き*/ > while(*dst != 0){ > *dst=*src; > src--; > dst++; > } の whileのループ条件が変です whileのループをさせたいのは strSrcの末尾から先頭までのはずですから末尾を求めた srcと strSrcが不一致の間ループするようにします # 投稿時に全角スペースなど使ってインデントしてソースを読みやすくしてみましょう
- asuncion
- ベストアンサー率33% (2127/6289)
main関数で > reverseStr( strSrc, strDst ) ; と書いて、reverseStr関数にstrSrc[]のアドレスと strDst[]のアドレスを渡していますので、 reverseStr関数の本体の先頭にある > src=strSrc; > dst=strDst; は不要です。
お礼
ご指摘のあった箇所を修正してプログラムを完成させる事ができました。 確かに短い src を、長い dst の分までデクリメントしたら上手くいきませんね。 そこで最終的には、示唆していただいたようにsrcと strSrcが不一致の間ループするようにすることにしました。 他にもわかりやすく多数のご指摘ありがとうございました。 非常に参考になりました。 #include <stdio.h> /* 文字列反転関数 引数: char *src : 反転させる文字列 char *dst : 反転させた結果を書き込む文字列 返値: なし */ void reverseStr(char *src, char *dst) { /*文字列の末尾を指すまでインクリメント*/ while(*src != 0){ src++; } while(*src != 'a'){ src--; /*文字列の最初を指すまでデクリメント*/ *dst=*src; /*『配列strDstの番地の値』に『配列strSrcの番地の値』を格納*/ dst++; /*行入れ替え*/ } *dst=0;/*配列strDstの終了*/ } /* メイン関数 引数: なし 返値: int 正常終了時 0 */ int main(void) { char strSrc[] = "abcdefghijkl" ; char strDst[] = "01234567890123456789" ; reverseStr( strSrc, strDst ) ; printf("%s\n", strDst ) ; return( 0 ); }