HiveBrain v1.2.0
Get Started
← Back to all entries
snippetcMinor

C code to parse out certain characters in a string

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
parsecharacterscodecertainstringout

Problem

I have the following code

int eval(char* string) {

char* token;

outputString[0] = NULL;

token = strtok(string, " ");

while(token != NULL){

   if(strstr((char *) token, "@") != NULL) {
      strcat(outputString, "@");
      token = calc(token);
   }
   strcat(outputString, token);
   strcat(outputString, " ");
   token = strtok(NULL, " "); 
}

 printf("%s\n", outputString);

}


It is called on a string that looks like this

The water has @TREE and @SKY in it.


This code works completely fine. However I want to make it more efficient.

The code is supposed to do the following --

Cut the string up by spaces, however, if an @ is found, it should be sent away to be evaluated by calc();. If none are found, we continue splitting the string by spaces until one is actually found. While we are running through, we concatenate it onto outputString and continue forward.

Solution

-
outputString doesn't have enough room to accomodate the results. It can hold just one byte. It is just unlucky coincidence that the code does not segfault. In any case, undefined behaviour.

If the intention is just to print the result out, you don't need outputString at all. Just printf the tokens as you compute them.

-
strcat must scan the entire outputString to figure out where it ends. The overall time complexity of the repeated strcats becomes roughly quadratic. I recommend to maintain a pointer to the end of outputString, and strcpy the token.

Context

StackExchange Code Review Q#159848, answer score: 2

Revisions (0)

No revisions yet.