cchartokenizec-stringsstrstr

C Programming - Space Character Not Detected


Mainly a Java/Python coder here. I am coding a tokenizer for an assignment. (I explicitly cannot use strtok().) The code below is meant to separate the file text into lexemes (aka words and notable characters).

char inText[256];
fgets(inText, 256, inf);

char lexemes[256][256];
int x = 0;

char string[256] = "\0";
for(int i=0; inText[i] != '\0'; i++)
{
    char delims[] = " (){}";
    char token = inText[i];

    if(strstr(delims, &inText[i]) != NULL)
    {
        if(inText[i] == ' ') // <-- Problem Code
        {
            if(strlen(string) > 0)
            {
                strcpy(lexemes[x], string);
                x++;
                strcpy(string, "\0");
                (*numLex)++;
            }
        }
        else if(inText[i] == '(')
        {
            if(strlen(string) > 0)
            {
                strcpy(lexemes[x], string);
                x++;
                strcpy(string, "\0");
                (*numLex)++;
            }
            strcpy(lexemes[x], &token);
            x++;
            (*numLex)++;
        }
        else
        {
            strcpy(lexemes[x], &token);
            x++;
            (*numLex)++;
        }
    }
    else
    {
        strcat(string, (char[2]){token});
    }
}

For some odd reason, my code cannot recognize the space character as ' ', as 32, or by using isspace(). There are no error messages, and I have confirmed that the code is reaching the space in the text.

This is driving me insane. Does anyone have any idea what is happening here?


Solution

  • You are using the function strstr incorrectly.

    if(strstr(delims, &inText[i]) != NULL)
    

    the function searches exactly the string pointed to by the pointer expression &inText[i] in the string " (){}".

    Instead you need to use another function that is strcspn.

    Something like

    i = strcspn( &inText[i], delims );
    

    or you can introduce another variable like for example

    size_t n = strcspn( &inText[i], delims );
    

    depending on the logic of the processing you are going to follow.

    Or more probably you need to use the function strchr like

    if(strchr( delims, inText[i]) != NULL)