2012-10-13 3 views
1

처음 게시 할 때 여기에 처음 게시되므로 엉망이되면 죄송합니다. 문자열을 검색하고 강조 표시된 검색 데이터가 포함 된 문자열을 반환해야합니다.문자열 검색 C

예 : Hi my name is, 내 검색어는 다음과 같습니다 : 내 초기 문자열 인 경우 name, 출력이되어야한다 : Hi my NAME is

이 내가 그 작품을 쓴 빠른 코드는하지만 한 번만 사용할 수 있습니다. 만약 내가 다시 시도하면 seg faults.

누군가이 코드를 쓰면 더 좋은 방법으로 나를 암시 할 수 있기를 바랬는데,이 코드가 역겨운 데! 내가 게으른 멍청하고 (이것을 고약한 많은 어렵게) 멀티 바이트 문자 적합성에 대한 전제 조건은 없었다 때문

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

찾기, 복사가'strncpy에서 수행 할 수 있습니다 '('strcpy '를 사용하지 말 것). 'printf ("%. * s", number_of_char_to_print, pointer_to_position_to_start_printing)'를 사용하여 원래 문자열의 일부를 인쇄 할 수 있습니다. – nhahtdh

답변

0

. 더 효율적인 방법이 있지만 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; 
} 

출력은 다음과 같습니다 : 문자열의 길이가 strlen` '와 함께 할 수

Hi! My NAME is George. 
+0

은 완벽합니다. 문자열에 단어가 포함되어 변경되었는지 여부를 파악하는 간단한 방법이 있습니까? – Skittles

+0

strcmp를 사용하여 좋은 방법을 찾았습니다. 컴파일 할 때 완벽하게 작동하지만 경고 : 'p'에 대한 연산이 정의되지 않았을 수 있습니다. – Skittles

+0

@Skittles 흥미로운 경고입니다. 분명히 3 개의 서로 다른 back-to-back for-loops에서 사용되기 때문입니다. 얼마나 긍정적으로 이상한가. – WhozCraig