1

ここに投稿するのは初めてなので、間違っていたらごめんなさい。文字列を検索し、検索データが強調表示された検索データを含む文字列を返す必要があります。

例: 最初の文字列が:Hi my name isで、検索語が:nameの場合、出力は次のようになります。Hi my NAME is

これは私が書いた簡単なコードですが、動作するのは 1 回だけです。もう一度検索しようとすると、セグメント障害が発生します。

このコードはうんざりするので、誰かがこれを書くためのより良い方法を教えてくれることを望んでいました!

void search(char * srcStr, int n){
    int cnt = 0, pnt,i = 0; 
    char tmpText[500];
    char tmpName[500];
    char *ptr, *ptr2, *ptrLast;
    int num;


    while(*(node->text+cnt) != '\0'){ //finds length of string
        cnt++;
    }
    for(pnt = 0; pnt < cnt; pnt++){ //copies node->text into a tmp string
        tmpText[pnt] = *(node->text+pnt);
    }
    tmpText[pnt+1] = '\0';


        //prints up to first occurrence of srcStr
      ptr = strcasestr(tmpText, srcStr); 
        for(num = 0; num < ptr-tmpText; num++){
            printf("%c",tmpText[num]);
        }

      //prints first occurrence of srcStr in capitals
        for(num = 0; num < n; num++){
            printf("%c",toupper(tmpText[ptr-tmpText+num]));
      }

      ptr2 = strcasestr((ptr+n),srcStr);
        for(num = (ptr-tmpText+n); num < (ptr2-tmpText); num++){
            printf("%c",tmpText[num]);
        } 

        while((ptr = strcasestr((ptr+n), srcStr)) != NULL){
            ptr2 = strcasestr((ptr+n),srcStr);
        for(num = (ptr-tmpText+n); num < (ptr2-tmpText); num++){
            printf("%c",tmpText[num]);
        } 
        for(num = 0; num < n; num++){
                printf("%c",toupper(tmpText[ptr-tmpText+num]));
          }
          ptrLast = ptr;
      }
      //prints remaining string after last occurrence
        for(num = (ptrLast-tmpText+n); num < cnt; num++){ 
            printf("%c",tmpText[num]);
        }
}
4

1 に答える 1

0

私が愚かで怠け者で、マルチバイト文字に準拠するための前提条件がなかったからです (これは非常に困難です)。より効率的な方法はありますが、プラットフォームがなければ、はるかに簡単strupr()strlwr()することは困難です。

注: これは、検索テキストが厳密に小文字ではなく、大文字と小文字が混在してソースに存在する可能性を考慮に入れています。問題のドメインが完全な小文字の一致のみを置換するように制限されている場合、ソース dup も削除することができます。これにより、さらに約 6 行少なくなります。

// search for lower case
void substlwr(char* text, const char* str)
{
    // dup strings for lower case  text and search content, 
    //  and upper case replacement text.
    size_t slen = strlen(str);
    char *lbase = strdup(text);
    char *lstr = strdup(str);
    char *ustr = strdup(str);
    char *found = lbase;
    char *p = NULL;

    // convert lowers and uppers
    for (p=lbase; p && *p; *p++ = tolower(*p));
    for (p=lstr; p && *p; *p++ = tolower(*p));
    for (p=ustr; p && *p; *p++ = toupper(*p));

    // replace all lowers with uppers
    while ((found = strstr(found, lstr)))
    {
        memcpy(text + (found-lbase), ustr, slen);
        found += slen;
    };

    free(lbase);
    free(lstr);
    free(ustr);
}

サンプル呼び出しは次のようになります。

int main(int argc, char *argv[])
{
    char text[] = "Hi! My Name is George.";
    substlwr(text, "name");
    printf("%s\n", text);
    return EXIT_SUCCESS;
}

出力は次のようになります。

Hi! My NAME is George.
于 2012-10-13T05:12:03.993 に答える