J'essaie d'analyser une chaîne de requête URL en C et je ne vois pas comment le faire avec élégance. Toute astuce ou suggestions serait grandement appréciée:
static void readParams(char * string, char * param, char * value) { char arg[100] = {0}; // Not elegant, brittle char value2[1024] = {0}; sscanf(string, "%[^=]=%s", arg, value2); strcpy(param, arg); strcpy(value, value2); } char * contents = "username=ted&age=25"; char * splitted = strtok (contents,"&"); char * username; char * age; while (splitted != NULL) { char param[100]; // Not elegant, brittle char value[100]; char * t_str = strdup(splitted); readParams(t_str, param, value); if (strcmp(param, "username") == 0) { username = strdup(value); } if (strcmp(param, "age") == 0) { age = strdup(value); // This is a string, can do atoi } splitted = strtok (NULL, "&"); }
4 Réponses :
En général Strtok enfreint la chaîne source à utiliser par d'autres fonctions. Voici un exemple à os nus d'utiliser strtok pour jeton de goûter une chaîne
Les hypothèses ne sont pas une mauvaise chose, en général, et surtout dans un code rapide, robuste et protecteur (en considérant, par exemple, que votre chaîne d'entrée a un format invalide). p>
Pour atteindre le plus grand code élastique, vous devez également allouer manuellement (et interlocaliser après l'utilisation de l'utilisation!) La mémoire des chaînes, dont la taille doit être de totaliser la longueur d'une chaîne d'entrée (une fois de plus où une limite raisonnable est un must) , comme il est inconnu (en général) combien de temps les pièces de chaîne de paramètres et de valories sont-elles. P>
Vous devez soit adapter un analyseur complexe et efficace ou régler avec des bibliothèques qui le feront pour vous. P>
uiparser doit vous fournir tout ce dont vous avez besoin (plus il prend en charge UNICODE). P >
Je fais:
char querystring[]="a=1&b&c=3&d=&meh=5"; int pc=0; char *tok; char *otok; for(tok=strtok(querystring,"&");tok!=NULL;tok=strtok(tok,"&")) { pc++; otok=tok+strlen(tok)+1; tok=strtok(tok,"="); fprintf(stderr,"param%d: %s ",pc,tok); tok=strtok(NULL,"="); fprintf(stderr,"value%d: %s\n",pc,tok); tok=otok; };
Quelle est la question? Peut-être que c'est mon mauvais anglais mais je ne peux pas comprendre quelle partie du code vous trouble et pourquoi.
Ce n'est pas tellement troublant car il est que le code repose sur certaines hypothèses (comme la valeur et le param étant moins que la taille 100) qui le rendent moins élégant que possible.