2017-02-20 2 views
2

정확한 단어를 찾으려면 strstr 함수를 사용할 수 있습니까? 나는 그러나,c에서 사용하는 정확한 단어 일치

char* line = "hellodarkness my old friend"; 

만약 내가 (하지 NULL 일)과 일치합니다
result = strstr(line, "hello"); 

result

를 사용 : 예를 들어, 내가 단어 hello 및 입력 문자열 line가 있다고 가정 해 보자 정확한 단어 "hello"만 일치 시키려면 ("hellodarkness"가 일치하지 않도록) 결과가 NULL이됩니다. strstr을 사용하여이 작업을 수행 할 수 있습니까? 아니면 fscan을 사용해야하고 단어별로 단어를 스캔하고 일치하는 항목이 있는지 확인해야합니까?

+3

'않는 strstr()가이'... 경기에 불과 참 또는 거짓이 아닌 포인터를 반환 단지 확인 : 아무것도 발견되지 않는 경우는 첫 번째 일치 또는 NULL에 대한 포인터를 반환 그 전후의 문자는 영문자가 아닙니다 (또는 원하는 경우 영숫자가 아닙니다). 그렇지 않은 경우 유효한 일치를 얻었고, 일치하는 경우 반환 된 포인터를 지나서 다시 시도하십시오. – Dmitri

+1

['strstr()'에 대한 문서 (https://linux.die.net/man/3/strstr)는 그 동작을 설명합니다. 그것은 하나의 문자열이 다른 문자열의 하위 문자열로 나타나는 것을 찾습니다.그러한 부분 문자열이 발견되면'strstr()'자체는 부분 문자열의 모양을 둘러싼 문자에 대한 정보를 전달하지 않지만 주위를 둘러 볼 수 있습니다. –

답변

4

나는 것 : 시작 (line 같은 포인터)에서 찾을 경우 문자열이 문장

    • 선택하면, 단어의 길이를 추가하고 영숫자 문자를 찾을 수 있는지 확인합니다. 그렇지 않은 경우 (또는 null 종료)를 선택한 다음, 다른 곳에서는 찾을 경우
    • 일치 테스트 "이전에는 영숫자"여분을 추가하지

    코드 : 여기

    #include <stdio.h> 
    #include <strings.h> 
    #include <ctype.h> 
    int main() 
    { 
        const char* line = "hellodarkness my old friend"; 
        const char *word_to_find = "hello"; 
        char* p = strstr(line,word_to_find); 
        if ((p==line) || (p!=NULL && !isalnum((unsigned char)p[-1]))) 
        { 
        p += strlen(word_to_find); 
        if (!isalnum((unsigned char)*p)) 
        { 
         printf("Match\n"); 
        } 
        } 
        return 0; 
    } 
    

    그것은 아무것도 인쇄되지 않습니다 , 구두점/공백을 앞뒤에 삽입하거나 "hello" 뒤에 문자열을 종료하면 일치 항목이 생깁니다. 또한 전에 hello 앞에 alphanum chars를 삽입하여 일치하지 않습니다.

    편집 : 위의 코드는 단지 1 "hello" 일 때 유용하지만 두 번째를 찾지 못한 경우 "hello""hellohello hello"입니다. 따라서 우리는 다음과 같이 각각의 시간을 p 발전, 단어 나 NULL 찾기 위해 루프를 삽입해야합니다 :

    #include <stdio.h> 
    #include <strings.h> 
    #include <ctype.h> 
    int main() 
    { 
        const char* line = " hellohello hello darkness my old friend"; 
        const char *word_to_find = "hello"; 
        const char* p = line; 
    
        for(;;) 
        { 
        p = strstr(p,word_to_find); 
        if (p == NULL) break; 
    
        if ((p==line) || !isalnum((unsigned char)p[-1])) 
        { 
         p += strlen(word_to_find); 
         if (!isalnum((unsigned char)*p)) 
         { 
         printf("Match\n"); 
         break; // found, quit 
         } 
        } 
        // substring was found, but no word match, move by 1 char and retry 
        p+=1; 
        } 
    
        return 0; 
    } 
    
  • +0

    또한 문자열의 시작 부분이 아닌 경우 일치하기 전에 문자를 확인해야합니다. – Dmitri

    +0

    @Dmitri correct. C에서의 문자열 조작은 결코 쉬운 일이 아닙니다 ... –

    +0

    @ Jean-FrançoisFabre'if (p == line)'를 먼저 체크하고'if (! isalnum (p-1))','strlen (p)'그리고 'if (! isalnum (p + strlen (word_to_find)))'그리고 모든 가능성을 검사했다. – sabbahillel

    3

    strstr() 이후 수익률를 식별 할 문자열의 시작 위치에 포인터를, 당신은 strlen(result)을 사용할 수 있습니다.이 문자열이 긴 문자열의 하위 문자열이거나 찾고있는 고립 된 문자열인지 확인하십시오. strlen(result) == strlen("hello") 인 경우 올바르게 끝납니다. 공백이나 구두점 (또는 다른 구분 기호)으로 끝나면 끝 부분에서도 분리됩니다. 하위 문자열의 시작 부분이 "긴 문자열"의 시작 부분에 있는지 또는 공백, 구두점 또는 다른 구분 기호가 앞에 오는지도 확인해야합니다.

    +0

    ...하지만 다음 문자가 영숫자가 아니더라도'strlen()'은 행복하게 단어 뒤를 계속할 것이다. 그래서 어떻게 도움이 될까? – Dmitri

    +0

    @Dmitri 게시물의 구분 기호에 필요한 확인 참조를 추가했습니다. 나는 너무 빨리 입력하고 다음 문장을 넣지 않았습니다. – sabbahillel

    +0

    'char * hs = "hello", * str = "hello world"; char * x = strstr (hs, str);'... strlen (x)'는 11이고,'strlen (hs)'는 단지 5이다. 그러나 match는 유효해야한다. (전체 단어 일치). – Dmitri

    5

    여기에는 용도에 맞는 일반적인 기능이 있습니다. 당신이 일치하는 항목을 찾을 경우

    #include <ctype.h> 
    #include <string.h> 
    
    char *word_find(const char *str, const char *word) { 
        const char *p = NULL; 
        size_t len = strlen(word); 
    
        if (len > 0) { 
         for (p = str; (p = strstr(p, word)) != NULL; p++) { 
          if (p == str || !isalnum((unsigned char)p[-1])) { 
           if (!isalnum((unsigned char)p[len])) 
            break; /* we have a match! */ 
           p += len; /* next match is at least len+1 bytes away */ 
          } 
         } 
        } 
        return p; 
    }