NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

Re^2: 添削願い

投稿者: さん  2002/03/21 02:13  MLNo.138   [メール表示]

松本です。
適当に作成してみました。

こんな感じではどうでしょう?

デバッグ・コンパイルしていないので、間違い等あるかもしれませんが。

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

char* gsub(char* src, char* key1, char* key2)
/*
* srcのkey1をkey2に置き換え
*/
{
char *dest;
char *tmp = key1;
int i, nkey1_length;

nkey1_legnth = strlen(key1);

/* key1の出現回数取得 */
for (i = 0;;i++) {
tmp = strstr(tmp, key1);
tmp += nkey1_length;
}

if (!i) {
return NULL;
}

/* 領域確保 */
dest = malloc((strlen(src) + (strlen(key2)*i) - (nkey1_length*i) +
1);
if (!dest) {
return NULL;
}

/* 置換 */
tmp = strstr(src, key1);
dest[0] = '\0';
for (j = 0; j < i; i++) {
strncat(dest, src, tmp - src);
strcat(dest, key2);
src += nkey1_length;
tmp += nkey1_length;
tmp = strstr(tmp, key1);
}

return dest;
}



このエントリーをはてなブックマークに追加


  • MLNo.139   TDaさん  (0) 2002/03/21 13:44  [メール表示する]
    松本さんへ

    TDaです。
    何とか動くものにしてみました。
    でもまだkey1が2回以上でてきたときの処理がおかしいです。
    再帰処理の方がすっきり書けるはずなので変更してみます。
    それとgsubで確保したdestを返り値にしてもいいのでしょうか?

    /* =========================================================== */

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

    char *gsub(char *src, const char *key1, const char *key2)
    /*
    * srcのkey1をkey2に置き換え
    */
    {
    char *dest;
    char *tmp = key1;
    int i, j;
    int nkey1_length;

    nkey1_length = strlen(key1);

    /* key1の出現回数取得 */
    for (i = 0, tmp = src; ; i++) {
    tmp = strstr(tmp, key1);
    if (!tmp)
    break; /* これちょっとダサいよね */
    tmp += nkey1_length;
    }

    /* 置換するものがないときはそのまま返す。 */
    if (!i)
    return src;

    /* 領域確保 */
    dest = malloc(strlen(src) + (strlen(key2) - nkey1_length) * i + 1);
    if (!dest)
    return "メモリが足りません。";

    /* 置換 */
    dest[0] = '\0';
    for (j = 0; j < i; j++) {
    tmp = strstr(src, key1);
    strncat(dest, src, tmp - src); /* key1の直前までdestにコピー */
    strcat(dest, key2); /* 続けてkey2をコピー */
    src = strstr(src, key1);
    src += nkey1_length; /* key1の終わりまでポインタを進める */
    strcat(dest, src); /* key1の終わりから最後までコピー */
    }

    return dest;
    }

    int main(int argc, char **argv)
    {
    char *buf;

    printf("元の文字列[%s], key1[%s], key2[%s]\n", argv[1], argv[2], argv[3]);
    printf("/* === %sを%sに置換する === */\n", argv[2], argv[3]);

    buf = gsub(argv[1], argv[2], argv[3]);
    printf("%s\n", buf);

    return 0;
    }

    /***************************************/
    /* TDa mailto:tda@… */
    /***************************************/


メールへの返信はMLのメンバーしかできません。

更新順メールリスト