Cette solution possède deux boucles imbriquées de strtok_s
, car strtok
n'est pas réentrant. C'est MSVC, certains systèmes implémenter le strtok_r
similaire.
J'ai créé une sortie en conformité avec le haut de votre question, cela peut être modifié pour convenir à d'autres sorties, ce n'était pas très clair. Dans ce cas, il n'était pas vraiment nécessaire d'avoir deux boucles imbriquées, mais vos exemples suivants confondent le problème en décomposant l'entrée comma'ed.
#include <stdio.h>
#include <string.h>
int main(void) {
char c[] = "[1,2,3][5,7,8]";
char *tok1 = NULL;
char *tok2 = NULL;
char *end1 = NULL;
char *end2 = NULL;
int comma = 0;
char identifier = 'a';
tok1 = strtok_s(c, "[]", &end1);
while(tok1 != NULL) { // outer loop splitting [bracket] parts
printf("%c = [", identifier);
comma = 0; // control comma output
tok2 = strtok_s(tok1, ",", &end2);
while(tok2 != NULL) { // inner loop splitting ,comma, parts
if(comma) { // check if comma required
printf(",");
}
printf("%s", tok2);
comma = 1; // a comma will be needed
tok2 = strtok_s(NULL, ",", &end2);
}
printf("] //of type int %c[]\n", identifier);
identifier++;
tok1 = strtok_s(NULL, "[]", &end1);
}
return 0;
}
Le programme plus simple où vous n'avez pas besoin d'examiner dans les [crochets] est
#include <stdio.h>
#include <string.h>
int main(void) {
char c[] = "[1,2,3][5,7,8]";
char *tok = NULL;
char identifier = 'a';
tok = strtok(c, "[]");
while(tok != NULL) {
printf("%c = [%s] //of type int %c[]\n", identifier, tok, identifier);
identifier++;
tok = strtok(NULL, "[]");
}
return 0;
}
Dans les deux cas, la sortie est:
a = [1,2,3] //of type int a[]
b = [5,7,8] //of type int b[]
EDIT modifié la deuxième exemple pour donner la sortie selon le commentaire récent de OP ci-dessus.
#include <stdio.h>
#include <string.h>
int main(void) {
char c[] = "[1,2,3][5,7,8]";
char *tok = NULL;
char identifier = 'a';
tok = strtok(c, "[]");
while(tok != NULL) {
printf("int %c[] = { %s };\n", identifier, tok, identifier);
identifier++;
tok = strtok(NULL, "[]");
}
return 0;
}
sortie du programme:
int a[] = { 1,2,3 };
int b[] = { 5,7,8 };
Pouvez-vous clarifier la sortie requise? L'exemple syntaxiquement incorrect * input * est clarifié dans l'exemple de code, mais le premier exemple de sortie est commenté comme '// de type int a []'. Voulez-vous dire que la sortie est 'int a [] = {1, 2, 3};'? Et l'exemple suivant * "au lieu de" * ne correspond pas au premier exemple. –
'strtok' ne fonctionnera pas car vous devez rechercher une virgule * ou *'] '. 'strtok' peut le faire, mais il ne vous dira pas lequel il a trouvé. Vous devez donc analyser la chaîne vous-même, en utilisant une boucle 'for' qui examine un caractère à la fois. – user3386109
@WeatherVane Oui, je voulais dire [] = {1, 2, 3}. Désolé pour la confusion. – user3213116