Programmation en C: Comment utiliser sscanf avec un": "séparateur?
J'ai essayé d'extraire les heures, les secondes et les minutes de l'entrée de texte à l'aide de sscanf
. Après sscanf
fonction est exécutée, seulement s
variable qui contient l'secondes a la bonne valeur. h
et m
qui ont des heures et des minutes en tenir uniquement des zéros. Veuillez suggérer des modifications à mon code ci-dessous.
char text[20];
if (fgets(text, sizeof text, stdin)!= NULL){
char* newline = strchr(text, '\n');
if (newline != NULL){
*newline = ' char text[20];
if (fgets(text, sizeof text, stdin)!= NULL){
char* newline = strchr(text, '\n');
if (newline != NULL){
*newline = '\0';
}
}
uint8_t s = 0;
uint8_t m = 0;
uint8_t h = 0;
sscanf(text, "%02i:%02i:%02i",&h,&m,&s);
';
}
}
uint8_t s = 0;
uint8_t m = 0;
uint8_t h = 0;
sscanf(text, "%02i:%02i:%02i",&h,&m,&s);
Note dans le débogueur, le texte a le droit des valeurs.
- pouvons-nous voir comment vous déclarer et initialiser h,m et s?
Vous devez vous connecter pour publier un commentaire.
Ce programme:
donne ce résultat:
La
%02i
conversions devraient également fonctionner, mais les chiffres sont un peu superflue.La version modifiée de la question montre que les variables sont de type
uint8_t
, dans ce cas, vous devez utiliser la conversion correcte des spécificateurs de<inttypes.h>
:Ce produit le même résultat qu'avant. Avec tout de la
scanf()
famille de fonctions, il est crucial que votre format de conversion les spécificateurs de correspondre aux types de pointeurs que vous êtes de passage dans la fonction. Vous pouvez vous en sortir avec pas mal de décalages dansprintf()
- certainement par comparaison, en raison d'un défaut de type entier (en particulier) des promotions, maisscanf()
est beaucoup moins indulgent.@Jonathan Leffler la réponse est tout à fait correct, mais...
Vous devriez jamais utilisation
scanf
oufscanf
ousscanf
pour l'analyse d'entrée de descripteur de fichier ou une chaîne de caractères, à l'exception peut-être en sait-à-être-jeté-loin-demain code. Ils sont trop sujettes à l'erreur et trop difficile à contrôler. Pour un résumé exhaustif des divers problèmes avecscanf
, je recommande cette série d'articles. Quelques faits saillants:getchar
.scanf
a tous les problèmes de débordement de la mémoire tampon degets
.scanf
s'analyse est sujette à erreur et difficile à utiliser. Utilisationstrtoul
etstrtod
à la place.Que faire?
gets
, qui est, sans débordement de la mémoire tampon des problèmes. Ne pas tenter de concilier les octets de les interpréter.strcspn
,strspn
, etstroul
etstrtod
combiné avec un code personnalisé pour analyser l'entrée.Il y a des moments où c'est trop de glisser, mais à ce moment généralement bâtiment une sorte de langue de saisie que les besoins plus généraux des techniques de toute façon.
sscanf()
questrtok()
. Au moins,strtok()
est toxique dans quelque chose comme une fonction de la bibliothèque. Vous devez savoir que le appelé la fonction de la bibliothèque utilise, et s'assurer que rien d'autre dans votre code à l'aide en même temps. Le mal! (Lorsqu'ils sont disponibles,strtok_r()
est beaucoup plus sûr et plus sain; il est au moins utilisable, mais il a encore quelques problèmes.)