2012-10-13 145 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