1

第一次在这里发帖,如果我搞砸了,我很抱歉。我需要搜索一个字符串并返回包含搜索数据的任何字符串,并突出显示搜索数据。

示例:如果我的初始字符串是:Hi my name is,我的搜索词是:name,那么输出应该是:Hi my NAME is

这是我编写的一个快速代码,它可以工作,但它只能工作一次。如果我尝试再次搜索它会出现故障。

我希望有人能提示我一个更好的方法来写这个,因为这段代码很恶心!

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()很难变得更简单。

注意:这考虑到搜索 txt 以混合大小写而不是严格的小写形式出现在源中的可能性。如果问题域被限制为仅替换精确的小写匹配,则也可以删除源副本,从而减少大约六行。

// 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 回答