Quel est l'effet de la fuite des blancs de l'espace dans un scanf() chaîne de format?
Quelle est la différence entre scanf("%d")
et scanf("%d ")
dans le présent code, d'où la différence est la fin vide dans la chaîne de format?
#include <stdio.h>
int main(void)
{
int i, j;
printf("enter a value for j ");
scanf("%d ",&j);
printf("j is %d\n", j);
printf("enter a value for i ");
scanf("%d", &i);
printf("i is %d\n", i);
return 0;
}
Comment le scanf()
fonction de travail lorsque j'ajoute des espaces après le spécificateur de format comme scanf("%d ", &j);
?
Peut-être qu'on devrait renommer le titre pour être plus général ?
pouvez-vous suggérer?
Je pensais à supprimer "de fuite"
pouvez-vous suggérer?
Je pensais à supprimer "de fuite"
OriginalL'auteur Vikas Verma | 2013-10-21
Vous devez vous connecter pour publier un commentaire.
Un caractère espace dans un format de scanf provoque explicitement les lire et de les ignorer comme de nombreux espaces comme il peut. Donc, avec
scanf("%d ", ...
, après avoir lu un certain nombre, il continue à lire les caractères, en supprimant tous les espaces jusqu'à ce qu'il voit un caractère non-blanc sur l'entrée. Que le caractère non-blanc sera le prochain caractère à lire par une fonction d'entrée.Avec votre code:
il apparaîtra à l'impression de la première ligne et ensuite, attendre pour vous d'entrer un nombre, puis continuer à attendre que quelque chose après le nombre. Donc, si vous venez de type 5Entrée, il va se bloquer — vous besoin de taper dans une autre ligne avec un certain caractère non-blanc sur elle pour continuer. Si vous tapez 6Entrée, qui deviendra la valeur de
i
, de sorte que votre écran ressemblera à quelque chose comme:Aussi, puisque la plupart des scanf %-conversions également passer leader d'espaces (tous à l'exception de
%c
,%[
et%n
), des espaces avant %-les conversions ne sont pas pertinents ("%d"
et" %d"
agira de manière identique). Donc, pour la plupart, vous devriez éviter les espaces dans les scanf conversions, sauf si vous savez que vous avez spécifiquement besoin d'eux pour leur effet curieux.OriginalL'auteur Chris Dodd
Un caractère d'espace blanc (espace, retour à la ligne, à l'horizontale et à la verticale de l'onglet) dans un format de chaîne de caractères correspond à un nombre quelconque de caractères d'espacement dans l'entrée.
Dans ton premier cas
lorsqu'il rencontre le blanc-espace de char (CSM)
' '
puis il va manger tous les espaces en blanc, entrée par l'utilisateur, y compris\n
sur la touche Entrée et il s'attend à entrer dans un non-CSM . Dans ce cas, votre programme s'arrête en appuyant sur Ctrl + Z.Pas sûr, mais pour MS-WIN:
Ctrl + D
OriginalL'auteur haccks
Un caractère espace dans votre
scanf
format correspond à un nombre quelconque de caractères espace tel que décrit parisspace
. Donc si vous avez des résidus espaces, retours à la ligne, tabulation ou tout autre caractère d'espacement puis il va aussi être consommés parscanf
avant il retourne.scanf()
ne reviendra pas jusqu'à ce que quelque chose qui n'est pas un espace blanc est entré. Qui, à son tour, signifie que vous devez deviner ce que le programme va demander suivant et entrez la valeur suivante avant l'entrée en cours est terminée. (Si vous n'avez pas saisir l'intégralité de la prochaine valeur, vous n'aurez plus de problèmes; le bizarre personnage (et le retour à la ligne qui doit être suivi avant le terminal envoie le caractère pour le programme) sera interprétée comme le champ suivant. Les espaces en fin de formats interactifs sont terribles!OriginalL'auteur Sergey L.
La différence (bien qu'évident) est une chaîne de format différent. Si vous entrez la ligne suivante:
"3 "
scanf()
sera de retour avec succès. Sinon, cela dépend de votre contribution.scanf()
essentiellement saute au-dessus d'espaces (les onglets, les espaces, retours à la ligne), et les recherches pour les valeurs alphanumériques dans le flux d'entrée. Depuis c'est la fuite des espaces, il obtient confonde avec la fuite caractère de saut de ligne à la fin de saisie lorsque vous appuyez sur ENTRÉE, de sorte qu'il est de peu de conséquence.scanf()
attend de l'entrée fournie pour correspondre exactement à la chaîne de format vous fournir, avec l'exception que les espaces contigus sont compressés en un seul caractère espace. Cela devient très important si vous voulez analyser les grandes chaînes de données de la chaîne de traitement équivalent,sscanf()
.Un bon exercice pour tester à fond ce serait quelque chose comme:
Par la suite, vérifier et voir ce que les valeurs de ces entiers sont après lui fournissant à la fois correctement et incorrectement formaté consolé d'entrée (ie: des espaces et des tirets). Voici quelques exemples d'exécution. Le premier sert d'entrée incorrecte, le second est utilisé correctement formaté à l'entrée. Notez que dans le premier cas,
C
n'a même pas de se mettre, commescanf()
sera fourni un comportement inattendu si l'entrée et le format des chaînes de caractères ne correspondent pas. En général, vous êtes mieux d'utiliser quelque chose commefgets()
pour obtenir une chaîne de caractères d'entrée de l'utilisateur, et ensuite utiliser diverses fonctions de recherche (ie: strstr(), strch(), strcat, strcpy, etc) pour analyser votre chaîne, car il est beaucoup plus sûr que de simplement en utilisantscanf()
et en supposant que l'utilisateur ne fera pas une erreur, que ce soit accidentellement ou délibérément.Maintenant, considérons un dernier run: Vous verrez que
scanf()
compacte de plusieurs espaces consécutifs caractères à un seul caractère, c'est pourquoi ces derniers s'exécute réussit effectivement:Il n'est de résumer de façon distincte les espaces sont tous regroupés en un seul, et comment la fuite des espaces dans cet exemple particulier est de peu de conséquence. Il décrit également comment la chaîne de format réduit essentiellement à un modèle de prévu les espaces et les non-blanc, et combien de cession de valeurs peut se produire pour certaines ou de toutes les variables en fonction lorsque l'entrée s'écarte du modèle de format. Je ne pense pas que c'était justifié.
Le code d'enregistrement et le rapport de la valeur de retour de
scanf()
. Qui permettrait de montrer combien les valeurs ont été définies. L'espace de fin dans une chaîne de format n'est pas "peu consquence" avec interactif d'entrée. Cela signifie que l'utilisateur doit taper un caractère autre qu'un espace blanc (et retour à la ligne est un espace blanc) avant la saisie est terminée.l'un des espaces avant le tiret dans le format de est importante; les autres ne le sont pas. Si il n'y a pas d'espace avant le tiret (par exemple,
"%d%d-%d"
), une entrée comme23 34 - 45
échoue parce que l'espace dans l'entrée ne correspond pas au tableau de bord au format (mais"%d%d -%d"
serait bien). Votre point principal est exacte; la plupart des espaces sont négligeables dans unscanf()
chaîne de format, mais pas tous les espaces sont négligeables, — et c'est la subtilité de qui sont et qui ne sont pas que bedevils l'utilisation descanf()
et coll. Et les espaces à droite dans les chaînes de format sont particulièrement pernicieuse!OriginalL'auteur DevNull