搜索字符串C.

时间:2012-10-13 03:34:24

标签: c string search highlight

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

实施例: 如果我的初始字符串为: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]);
        }
}

1 个答案:

答案 0 :(得分:0)

只是因为我是愚蠢的懒惰,没有先决条件与多字节字符一致(这使得 helluva 更难)。有更有效的方法,但除了strupr()strlwr()平台之外,很难简化。

注意:这考虑了搜索txt在混合情况下存在于源中的可能性,而不是严格小写的情况。如果问题域仅限于替换完全小写的匹配,则也可以删除源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.