Domanda

I have a string and an array of keywords. If the string contains one of the keywords on the list, I want to check if the keyword is the only element of this string. If it's not, I want to return an error. Last thing, the string will always end with \n.

My keyword array is the following:

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

For instance if my string is "BEGIN\n", everything is fine. If my string is "BEGIN FOO\n" or "FOO BEGIN\n", I have to return an error. Finally if my string is "BEGINFOO\n", everything is fine. (error code is 1, else it's 0)

I've tried something (I don't know how to proceed):

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;
    }

Thank you in advance (please don't complain bout my indent style, I have to use Whitesmith indent) !

È stato utile?

Soluzione

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;
    }

Altri suggerimenti

Perhaps another method?

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

I assume that since str is defined as "char * str" and not "const char * str", it is OK to modify the input string. Hence, why not just eliminate the '\n' problem from the equation?

   /* 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);
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top