Parsing and comparing strings on Arduino: different behaviour from gcc?

I am trying to parse a simple string, print the result of the parsing via serial.println, and trigger a function on the basis of the received command. I wrote the code below, which perfectly works in c (see the c file attached). However, the behaviour of the same code on the arduino IDE is completely different and I really can’t figure out why.

#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



void setup() {
  
    Serial.begin(115200);
}

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}

This code gives the following output on the serial monitor, which is wrong:

Send msg2:
message 2:
message_2
{message_2,0}

Send msg1:
message 2:
message_1
{message_2,0}

Send msg2:
message 2:
message_2
{message_2,0}

Send msg1:
message 2:
message_1
{message_2,0}

Firstly, I don’t understand why at the beginning, message 2 is printed before message 1, although message 1 was sent first. Second it is not clear to me the comparison done with strcmp is always returning the message 2.

More importantly, why running the same code in c has instead the correct output? I wonder if there is any error in my arduino code. BTW, I am testing the code on Teensy 3.2 but I plan to use it also on Arduino Uno.

The c code (which is perfectly working is this:

#include <string.h>
#include <stdio.h>


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"motor1_pattern1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"motor1_pattern2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}
char *all_tokens[2]; 
..
all_tokens[++i] = strtok(NULL, "{,}");
..
char msg1[] = "{message_1,1}";

How many tokens?

Thanks for your quick reply. I am very grateful to you for answering always to me and quickly.
There are two tokens, indeed I have defined *all_tokens[2]

Where is the error then? What is your suggestion?

My suggestion is to look at this linewhile (all_tokens[i] != NULL) { and ask yourself "What happens when i == 2?"

Thanks a lot. I amended as while (i < 2 && all_tokens != NULL) and now it works. However, I am not sure if this is actually the very best way to do it. Also, it is not really clear to me what is the reason for the code above to produce those results. Could you please explain this to me?
Moreover, I still wonder:
1- Why the serial monitor still displays first the second message although the first message was sent. It seems that the first message does not reach the serial monitor… what I am missing?
2- I don’t understand why the c code instead did not give a segmentation fault error when
3- do you suggest to use strtok_r instead of strtok?

Moreover, I still wonder:

Well, I wonder why your post is mostly in italics. There IS a proper way to post code.

2- I don't understand why the c code instead did not give a segmentation fault error when

When what? How would you have known whether a segmentation fault occurred? Why do you think that writing beyond the end of an array should generate a segmentation fault?

3- do you suggest to use strtok_r instead of strtok?

If you understood the differences between strtok() and strtok_r(), you would not need to ask the question. Since you don't, and apparently Mr. Google went on vacation, the answer is no.