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?
CodePudding user response:
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)