2014-05-11 4 views
0

문자열과 키워드 배열이 있습니다. 문자열에 목록에있는 키워드 중 하나가 포함되어 있으면 키워드가이 문자열의 유일한 요소인지 확인하고 싶습니다. 그렇지 않은 경우 오류를 반환하고 싶습니다. 마지막으로 문자열은 항상 \ n로 끝납니다. 예를 들어문자열에 목록의 단어가 포함되어 있습니까?

const char * keywordsTable[] = 
    { 
    "INIT", 
    "BEGIN", 
    "END", 
    "ROUTINES", 
    "ENDROUTINES", 
    "ENDWHEN", 
    "WHEN", 
    "WHILE" 
    }; 

내 문자열 "BEGIN\n"이 모든 것이 괜찮 경우 :

내 키워드 배열은 다음과 같다. 내 문자열이 "BEGIN FOO\n" 또는 "FOO BEGIN\n" 인 경우 오류가 발생합니다. 마지막으로 내 문자열이 "BEGINFOO\n"이면 모든 것이 좋습니다.

int CheckKeyword(char * str)  
    { 
    int nKeywords = sizeof(keywordsTable)/sizeof(keywordsTable[0]); 
    char * strTok = NULL; 
    char * keywrdWithLF = malloc(20); 
    // I don't want to check for the last two keywords nor the first 
    for (int i = 1; i < nKeywords - 2; i++) 
     { 
     strcpy_s(keywrdWithLF, 20, keywordsTable[i]); 
     strcat_s(keywrdWithLF, 20, "\n"); 
     strTok = strstr(str, keywrdWithLF); 
     // If my string contains a keyword 
     if (strTok != NULL) 
      { 
      // If the string contains other characters... and I'm stuck 
      if (strcmp(str, keywrdWithLF)) 
       { 
       } 
      else 
       { 
       free(keywrdWithLF); 
       return 1; 
       } 
      }   
     } 
    free(keywrdWithLF); 
    return 0; 
    } 

내 들여 한판 승부 불평하지 말아 주시기 바랍니다 (사전에 감사합니다

내가 해봤 뭔가 (내가 진행하는 방법을 모른다) (에러 코드는 다른는 0, 1) 스타일, 나는 Whitesmith 들여 쓰기를 사용해야한다)!

+0

좋아, 문제는 여기에 무엇입니까? –

+0

나는 내 코드에 갇혀있는 곳을 썼다. – Lovy

+1

"나는 갇혀있다"는 질문이 아닙니다. 문제가 정확히 무엇입니까? –

답변

1
int CheckKeyword(char * str)  
    { 
    int nKeywords = sizeof(keywordsTable)/sizeof(keywordsTable[0]); 
    char * strTok = NULL; 
    for (int i = 1; i < nKeywords - 2; i++) 
     { 
     if(NULL!=(strTok = strstr(str, keywordsTable[i]))) 
      { 
      int len = strlen(keywordsTable[i]); 
      if(strTok == str) 
       { 
       if(str[len]==' ' || str[len]=='\t') 
       return 1; 
       } 
      else 
       { 
       if((strTok[-1]==' ' || strTok[-1]=='\t') && isspace(strTok[len]))//isspace in <ctype.h> 
       return 1; 
       } 
      } 
     } 
    return 0; 
    } 
+0

''BEGIN \ n "'과'"BEGIN \ n "'은 다음과 같다. 이것에 대한 오류. – BLUEPIXY

+0

감사합니다. 명확하고 간결한 코드가 예상대로 작동합니다! – Lovy

1

아마도 다른 방법일까요?

int CheckKeyword(char * str)  
    { 
    int rCode=0; 
    int nKeywords = sizeof(keywordsTable)/sizeof(keywordsTable[0]); 
    char *keyword; 
    char *cp = keywordsTable; 

나는 STR은 "숯불 * str을"이 아니라 "CONST의 char * str을"로 정의되어 있기 때문에, 입력 문자열을 수정할 OK 있다고 가정합니다. 따라서 방정식에서 '\ n'문제를 제거하지 않는 이유는 무엇입니까?

/* Elininate the newline character from the end of the string. */ 
    if((cp = strchr(str, '\n')) 
     *cp = \0; 

    // I don't want to check for the last two keywords nor the first. 
    nKeywords -= 3; 
    ++keyword; 

    /* Loop through the keywords. */ 
    while(nKeywords) 
     { 
     // "I want to check if the keyword is the only element of this string." 
     // "If it's not, I want to return an error." 
     if((cp=strstr(str, keyword)) 
     { 
     /* Check for stuff prior to the keyword. */ 
     if(cp != str) 
      rCode=1; 

     /* Check for stuff after the keyword. */ 
     // Finally if my string is "BEGINFOO\n", everything is fine. 
     if(' ' == str[strlen[keyword]) 
      rCode=1; 

     if(strcmp(cp, keyword)) 
      rCode=1 

     break; 
     } 

     ++keyword; 
     --nKeywords; 
     } 

    return(rCode); 
    } 
+0

이 코드를 보내 주셔서 감사합니다.하지만 str 값을 수정할 수 없기 때문에 const를 넣는 것을 잊어 버렸습니다. 그래서 당신의 솔루션으로 나는 memcpy를 만들어야하고 다른 주어진 코드는 더 효율적이다. (같은 들여 쓰기 스타일을 사용 해줘서 고맙다) :) – Lovy

관련 문제