電子書籍の厳選無料作品が豊富!

文字列を引数にしたがって置換するプログラムを作りました。
test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ

引数 : abc=zz mnopq=u
- 出力結果 -
zzdefghijklurstuvwxyz

というような結果になるプログラムを作ったのですが、これをstr系とmem系の関数を使わずにポインタを使って組みなおしたいと思うのですが、全くわからないので質問させて頂きました。
よろしくお願いします。
質問下手なので質問でダメな点があれば随時補足していきたいと思います。


#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define BUF 128
#define MOJI 128
#define MAX 128

#pragma warning(disable : 4996)
using namespace System;

int main(int argc, char *argv[])
{
FILE *fp;
char txt[BUF];
char hiki_mae[MAX][MOJI];
char hiki_ato[MAX][MOJI];
int i = 0, n = 0, j = 0;
int hiki_num = 0;
char txt_mae[BUF], txt_ato[BUF];
char *p;
char sagyou_txt[BUF], sagyou_argv[MAX][MOJI];

if(argc < 2){
printf("argc = %d >>> パラメータ不足です\n", argc);
exit(1);
}
if( (fp = fopen("test.txt", "r")) == NULL ){
printf("ファイルがオープンできません\n");
exit(1);
}

for(i = 1; i < argc; i++){
if( strchr(argv[i], '=') != NULL && strlen(argv[i]) > 2){
strcpy(sagyou_argv[hiki_num],argv[i]);
p = strstr(sagyou_argv[hiki_num],"=");
*p = '\0';
strcpy(hiki_mae[hiki_num], sagyou_argv[hiki_num]);
strcpy(hiki_ato[hiki_num], sagyou_argv[hiki_num] + strlen(hiki_mae[hiki_num]) + 1);
hiki_num++;
}
}

while( fgets(txt, BUF, fp) != NULL){
printf("変換前>%s\n",txt);
}

for(n = 0; n < hiki_num; n++){
while( strstr(txt, hiki_mae[n]) != NULL ){
strcpy(sagyou_txt, txt);
p = strstr(sagyou_txt, hiki_mae[n]);
*p = '\0';
strcpy(txt_mae, sagyou_txt);
strcpy(txt_ato, sagyou_txt + strlen(txt_mae) + strlen(hiki_mae[n]));
strcat(txt_mae, hiki_ato[n]);
strcat(txt_mae, txt_ato);
strcpy(txt, txt_mae);
}
}
printf("変換後>%s\n",txt);

fclose(fp);
return 0;
}

A 回答 (4件)

 代替関数が出来ていて、なおかつ関数を使わずに記述したいというのであれば、その関数の中身を関数を使用している部分に展開すればいいだけです。


 あるいは関数じゃなくてマクロにするという方法もありますが、これは意図するものじゃないでしょう。

 該当の関数はずいぶん使っているみたいですから、全部展開するとかなり冗長なソースになりそうですが、頑張ってください。

 注意点としては、関数ならその引数や中のローカル変数は独立したスコープの変数なので(ポインタで受け渡ししているもの以外は)関数の外部を意識する必要はありませんが、関数ではなく直接処理を記述する場合はその前後の処理との間で変数の取り扱いをきちんと考える必要があります。
 ま、該当処理の部分を{}でくくってその中だけのローカル変数を使うとかいう方法もありますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘を受けた点に注意してプログラムを組みなおしてみます。

お礼日時:2010/10/18 19:23

なぜ関数を呼ばないように書き換えたいと思ったのか分かりませんが、一般的なアドバイスとしては「デメリットが多いのに比べてメリットはほとんどないのでお勧めしない」ということになります。


- 展開しようとしている各関数は複数回呼ばれているものが多いので、展開するとコードサイズが無駄に増える
- 手動で各関数を展開する際に書き間違えやすい
- 関数内に複数のreturn文があったりループの中からreturnしていたりする場合、それを展開しようとするとgotoを使う必要が生じたりしてきれいに書けない
- 展開後のソースコードは冗長で読みにくい
- 後から関数の仕様を変更したいとかバグを見つけて修正したいと思ったとき、複数の場所に展開されていると全てを正しく修正するのは面倒だったり見落としが生じたりする
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘を受けた点に注意してプログラムを組みなおしてみます。

お礼日時:2010/10/18 19:23

回答しようがなかったので補足をお願いします。



質問内容は何ですか?
組み直したいと思うがそれが実現可能かどうか知りたい、なのか
いっそ答え(組み直し後のソースコード)を提示してほしい、なのか
不明部分のヒントがほしい、なのか
はっきりしないので、何を回答すればいいのかが見えませんでした。

また、「全く分からない」とはどこが全く分からないのでしょう?
もう少し不明点を明確化できないでしょうか?
質問欄のソースコードにポインタが含まれることから
「ポインタって何ですか?」というレベルではないと思います。
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;
}

補足日時:2010/10/16 20:00
    • good
    • 0

質問番号6245803と6249995の人ですね。


strlen, strcat, strcpy, strstr, strchrの代替関数は自作できたということなので、それらの関数を呼ぶように書き換えればいいだけなのでは?
正しく動くかどうかの確認はしていません。

この回答への補足

回答ありがとうございます。
前回の質問にて代替関数は完成いたしました。また、それを使用すれば今回の質問内容はクリア出来たのですが、今回は関数化をしないで組みたいと思っています。
今まで関数の引数として渡していたもの等をどうやって書き換えれば良いのかわからなかったため今回は質問をさせていただきました。

補足日時:2010/10/16 11:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!