- ベストアンサー
ポインタを使って文字列の置換プログラムを作る方法
- ポインタを使用して文字列の置換プログラムを再構築する方法について質問します。
- 現在、文字列を引数に基づいて置換するプログラムを作成しましたが、str系とmem系の関数を使用せずにポインタを使用して再構築したいと考えています。
- 質問が下手なため、補足が必要な点があれば随時追加します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
代替関数が出来ていて、なおかつ関数を使わずに記述したいというのであれば、その関数の中身を関数を使用している部分に展開すればいいだけです。 あるいは関数じゃなくてマクロにするという方法もありますが、これは意図するものじゃないでしょう。 該当の関数はずいぶん使っているみたいですから、全部展開するとかなり冗長なソースになりそうですが、頑張ってください。 注意点としては、関数ならその引数や中のローカル変数は独立したスコープの変数なので(ポインタで受け渡ししているもの以外は)関数の外部を意識する必要はありませんが、関数ではなく直接処理を記述する場合はその前後の処理との間で変数の取り扱いをきちんと考える必要があります。 ま、該当処理の部分を{}でくくってその中だけのローカル変数を使うとかいう方法もありますが。
その他の回答 (3)
- salsberry
- ベストアンサー率69% (495/711)
なぜ関数を呼ばないように書き換えたいと思ったのか分かりませんが、一般的なアドバイスとしては「デメリットが多いのに比べてメリットはほとんどないのでお勧めしない」ということになります。 - 展開しようとしている各関数は複数回呼ばれているものが多いので、展開するとコードサイズが無駄に増える - 手動で各関数を展開する際に書き間違えやすい - 関数内に複数のreturn文があったりループの中からreturnしていたりする場合、それを展開しようとするとgotoを使う必要が生じたりしてきれいに書けない - 展開後のソースコードは冗長で読みにくい - 後から関数の仕様を変更したいとかバグを見つけて修正したいと思ったとき、複数の場所に展開されていると全てを正しく修正するのは面倒だったり見落としが生じたりする
お礼
回答ありがとうございます。 ご指摘を受けた点に注意してプログラムを組みなおしてみます。
- d_g
- ベストアンサー率39% (48/121)
回答しようがなかったので補足をお願いします。 質問内容は何ですか? 組み直したいと思うがそれが実現可能かどうか知りたい、なのか いっそ答え(組み直し後のソースコード)を提示してほしい、なのか 不明部分のヒントがほしい、なのか はっきりしないので、何を回答すればいいのかが見えませんでした。 また、「全く分からない」とはどこが全く分からないのでしょう? もう少し不明点を明確化できないでしょうか? 質問欄のソースコードにポインタが含まれることから 「ポインタって何ですか?」というレベルではないと思います。 strcpyと同じようなことをする処理を作れない、なのか strcpyと同じような処理はできるがそれを関数化する方法が分からない、なのか 処理を作れないし関数化の方法も分からない、なのか はっきりすれば回答もしやすくなります。 > test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ 質問欄のソースコードにそれらしい処理はありませんが、 これはプログラムを動かす前にこういう下準備をしておけという内容でしょうか?
補足
回答ありがとうございます。 > test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ これはエクスプローラー上でテキストファイルを作成しておくという意味です。言葉が足りなくて申し訳ありません。 質問としては今までstrcpy関数等を使っているところを使わないで書きたいということになります。 例えば >strcpy(hiki_mae[hiki_num], sagyou_argv[hiki_num]); という部分をstrcpy関数を使用しないで書くとどうなるか教えていただきたいと思います。 自作したstrcpy関数に近いものがあるのですが、これをソースコードのstrcpy関数がある行にstrcpy関数の代替えとして使用したい場合(関数としての使用ではなく)、どういう風に書けばいいのか教えていただきたいです。 ↓自作strcpy関数 char *MyStrcpy(char *str1, const char *str2) { char *p1 = str1; const char *p2 = str2; while( *p2 != '\0'){ *p1 = *p2; p1++; p2++; } if(*p2 == '\0'){ *p1 = *p2; } return p1; }
- salsberry
- ベストアンサー率69% (495/711)
質問番号6245803と6249995の人ですね。 strlen, strcat, strcpy, strstr, strchrの代替関数は自作できたということなので、それらの関数を呼ぶように書き換えればいいだけなのでは? 正しく動くかどうかの確認はしていません。
補足
回答ありがとうございます。 前回の質問にて代替関数は完成いたしました。また、それを使用すれば今回の質問内容はクリア出来たのですが、今回は関数化をしないで組みたいと思っています。 今まで関数の引数として渡していたもの等をどうやって書き換えれば良いのかわからなかったため今回は質問をさせていただきました。
お礼
回答ありがとうございます。 ご指摘を受けた点に注意してプログラムを組みなおしてみます。