2012-10-13 95 views
1

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

例子: 如果我的初始字符串为:Hi my name is,我的搜索词是:name,则输出应为:Hi my NAME is

这是一个简单的代码我写的作品,但它只能使用一次。如果我尝试再次搜索seg故障。

我希望有人能够以更好的方式暗示我写这篇文章,因为这段代码很恶心!

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]); 
     } 
} 
+2

查找字符串的长度可以用'strlen'来完成,副本可以用'strncpy()函数来完成'(尽量不要使用'strcpy')。您可以使用'printf(“%。* s”,number_of_char_to_print,pointer_to_position_to_start_printing)'打印部分原始字符串。 – nhahtdh

回答

0

只因为我傻懒,没有先决条件的多字节字符一致性(这使它成为一个宏大很多困难)。有更有效的方法,但禁止使用strupr()strlwr()的平台很难变得更简单。

注意:这考虑到搜索txt在混合格式中存在的可能性,而不是严格小写。如果问题域被限制为只能替代确切的小写匹配,那么源dup也可以被丢弃,从而使得这个数量减少了大约六分之一。

// 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. 
+0

这是完美的,是否有一个简单的方法来确定字符串是否包含该单词,从而被改变? – Skittles

+0

没关系我用strcmp制定了一个很好的方法。这个工作完美,但是当我编译它给出了错误 警告:'p'上的操作可能是未定义的 – Skittles

+0

@Skittles有趣的警告,因为它显然是用于三个不同的背靠背for循环。有多奇怪。 – WhozCraig