Comment puis utilise strtok() que pour les 2 premiers block

Bonjour à tous!!!

J'ai un char qui contient 9 mots:

char command[20]; // ss 1 envoyer un message pour la pos 1

Ensuite, je souhaite decortiquer ces mots en les plaçant dans des varaiable

char *cha, *pos, *message;

    cha = strtok(command," ");
    int k=0;
    do{
      switch(k)
      {
        case 0:
          pos = atoi(strtok(NULL," "));
          break;
        case 1:
          message = strtok(NULL," ");
          break;
        default:
          strcat(message, " ");
          strcat(message, strtok(NULL," "));
      }
      k++;
    }while(cha != NULL)

;

Je voudrais donc que cha contient ss (pour send sms) pos contient 1 (pour le numero de portable enregistré à la position1) message contient "envoyer un message pour la pos 1"

Le problème est que vu qu'après "envoyer" il y a encore des espaces, il va continuer à spliter mes mots alors que ce qui suit après "envoyer", doit etre sauver dans 'message'.

Comment peut-on "stopper" strtok() avant le break de case 0?

Pour le moment, j'ai strcat dans 'default', mais je ne suis pas convaincu que c'est la meilleur solution...

Merci

Plusieurs solutions:

  • utiliser un séparateur différent entre les champs ; par exemple
  • utiliser strtok_r la version ré-entrante de strtok qui possède un argument supplémentaire saveptr qui mémorise la position dans la chaîne et que tu pourrais utiliser pour connaitre la position du message après avoir extrait pos

Bonjour,

Il suffit d’arrêter quand k atteint la valeur 2
ce qui donne:

//char *cha, *pos, *message;  // erreur pos doit être un entier
  
char *cha, *message;
int pos;

    cha = strtok(command," ");
    int k=0;
    do{
      switch(k)
      {
        case 0:
          pos = atoi(strtok(NULL," "));
          break;
        case 1:
          message = strtok(NULL," ");
          break;
      }
      k++;
    }while(cha != NULL && k<2);
}

Oui effectivement mais on ne sait pas où on est arrêté sauf à refaire un strstr avec le résultat du dernier strtok, pour récupérer le message complet, d'où ma proposition d'utiliser strtok_r.

hello Mais dans la propisition de kamill, 'message' ne contiendra que "envoyer"? Je vais étudier le strtok_r

fdufnews: Oui effectivement mais on ne sait pas où on est arrêté sauf à refaire un strstr avec le résultat du dernier strtok, pour récupérer le message complet, d'où ma proposition d'utiliser strtok_r.

Tu as raison, mais ce n'était pas dans l'énoncé de la question