sscanf
fonctionne comme ceci:Existe-t-il une variante de sscanf avec un pointeur vers une chaîne d'entrée au lieu de tampons?
int main(const int argc, const char *argv[]) {
char buf1[1024] = {0};
char buf2[1024] = {0};
char buf3[1024] = {0};
char *str = "abc, 123; xyz";
sscanf(str, "%[^,], %[^;]; %s", buf1, buf2, buf3);
printf("'%s' '%s' '%s'", buf1, buf2, buf3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
Je me demande s'il y a une fonction qui ne nécessite pas la copie du contenu de str
dans les tampons (buf1, buf2, buf3
), ni allouer une nouvelle mémoire. Au lieu de cela, il suffit de définir les pointeurs (ptr1, ptr2, ptr3
) pour pointer sur les parties correspondantes dans str
et de mettre fin à tout ce qui vient après la correspondance.
int main(const int argc, const char *argv[]) {
char *ptr1 = NULL;
char *ptr2 = NULL;
char *ptr3 = NULL;
char *str = "abc, 123; xyz";
//
// str = "abc, 123; xyz\0"
//
_sscanf(str, "%[^,], %[^;]; %s", &ptr1, &ptr2, &ptr3);
//
// str = "abc\0 123\0 xyz\0"
// ^ ^ ^
// ptr1 ptr2 ptr3
//
printf("'%s' '%s' '%s'", ptr1, ptr2, ptr3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
Je sais qu'il ya des fonctions telles que strtok_r
et la bibliothèque regex.h
qui pourrait être utilisé, mais je pense que ce serait plus pratique dans les cas où la chaîne d'entrée peut être modifiée.
Le problème est que ne peut pas * toujours * se terminer par l'entrée analysé par 'sscanf'! Le 'regex.h' renvoie * plages * des correspondances de sous-groupe - ce serait faisable. –
Votre question est un non-sens comme si vous annulez la chaîne d'origine quelque part au milieu, vous ne serez plus jamais la même chaîne, car vous écraserez quelque chose BTW même si vous déplacez le reste de si la taille de la str sera augmentation et la réaffectation la plus probable sera nécessaire –
Notez que j'ai dit dans certains cas. Dans certains cas, je me fiche de savoir si la chaîne d'entrée est modifiée. –