La modification de la scanf() délimiteur
Mon objectif est de changer le séparateur de scanf
"\n
".
J'ai essayé d'utiliser scanf("%[^\n]s",sen);
et fonctionne très bien pour une seule des entrées.
Mais quand j'ai mis la même ligne à l'intérieur d'un for
boucle pour plusieurs phrases, il me donne des ordures valeurs.
Personne ne sait pourquoi?
Voici mon code:
char sen[20];
for (i=0;i<2;i++)
{
scanf("%[^\n]s",sen);
printf("%s\n",sen);
}
fonctionne dans le sens qu'il lit une ligne dans le terminal avec
Je pense que vous avez juste besoin d'enlever la finale
essayé juste avec
Vous devez supprimer le saut de ligne à partir de la mémoire tampon d'entrée.
Viens de remarquer que le compilateur ne pas exécuter l'
\n
comme délimiteur et j'ai oublié de mettre le signe%, édité cependant.Je pense que vous avez juste besoin d'enlever la finale
's'
de la chaîne de format. Le %[^\n]
spécifie à lire les caractères jusqu'à la prochaine '\n'
, puis le 's'
veut un littéral 's'
dans l'entrée.essayé juste avec
%[^\n]
il donne toujours des ordures valeursVous devez supprimer le saut de ligne à partir de la mémoire tampon d'entrée.
Viens de remarquer que le compilateur ne pas exécuter l'
scanf
déclaration à l'intérieur de la for
boucle, mais il ne va à l'intérieur de la boucle. Utilisé pour prendre des entrées à partir d'un fichier de sorte din pas le remarquer plus tôt.
OriginalL'auteur firecast | 2012-10-14
Vous devez vous connecter pour publier un commentaire.
Considérer ce (C99) code:
Quand je l'exécuter et tapez une chaîne de caractères " absolument n'importe quoi avec les espaces TABTABonglets à gogo!', il me donne:
ASCII (UTF-8) 1010 est de retour à la ligne, bien sûr.
Est-ce à vous aider à comprendre votre problème?
Il y a des raisons pourquoi beaucoup (la plupart?) connu C programmeurs éviter
scanf()
etfscanf()
comme de la peste; ils sont trop difficiles à obtenir pour fonctionner correctement. Je recommande cette solution, à l'aide desscanf()
, qui n'a pas la même exécration quescanf()
etfscanf()
faire.Ce lit à la ligne d'entrée (à l'aide de
fgets()
qui n'assure aucun dépassement de la mémoire tampon (prétendre que lagets()
fonction, si vous avez entendu parler de lui, le fond de votre ordinateur à un bassin de métal et de silicium), puis utilisesscanf()
pour traiter cette ligne. Il traite avec des sauts de ligne, qui sont la chute du code original.Problèmes:
scanf()
réussi.Valeur de retour de
scanf()
La définition de
scanf()
(à partir de la norme ISO/IEC 9899:1999) est:Noter que lorsque la boucle dans mon premier programme quitte, c'est parce que
scanf()
retourné 0, pas EOF.scanf
retourne une valeur dans votre code?le code fourni par vous fonctionne bien. Mais juste par curiosité, j'ai accidentellement changé mon code de
scanf("%[^\n]s",sen);
àscanf(" %[^\n]s",sen);
et il a commencé à bien fonctionner. Savez-vous pourquoi?L'espace à l'avant du format mange errants blanc de l'espace, y compris les retours à la ligne (peut-être plusieurs d'entre eux), avant de commencer le processus de numérisation, de conversion. C'est important pour la
%c
et de numérisation de l'ensemble des conversions; tous les autres AFAICR déjà sauter menant l'espace blanc de toute façon. Les subtilités de lascanf()
chaînes de format sont nombreux; il est très complexe de la fonction à utiliser correctement. Vous devriez prendre le temps de lire parfois (disponible à partir de la norme ANSI pour 35 $PDF—vaut bien l'investissement si vous allez être un sérieux programmeur C), ou à tout le moins de votre système, page de man. Et la relire, souvent.aussi, ce serait l'équivalent de
"%255[^\n]"
pour obtenir un nombre entier au lieu d'une chaîne de caractères (%d
)?Je ne comprends pas votre commentaire précédent. Vos commentaires peuvent être interprétées de plusieurs manières. Vous pouvez utiliser
%d
ou%ld
ou%lld
ou"%" PRIdMAX
d'obtenir, éventuellement, un-entier signé. Je ne pense pas que vous pouvez vous arrêter à l'utilisateur d'entrer ou de l'entrée d'accepter un signe (+
ou-
). Si vous voulez saisir une chaîne de chiffres, alors vous pouvez utiliser%255[0-9]
d'entrée jusqu'à 255 chiffres suivis par un octet nul (si la variable doit êtrechar buffer[256];
ou plus).OriginalL'auteur Jonathan Leffler
%[^\n]
quitte le retour à la ligne dans le tampon.%[^\n]%*c
mange le caractère de saut de ligne.En tout cas,
%[^\n]
peut lire n'importe quel nombre de caractères et de la cause de dépassement de tampon ou pour le pire.J'utilise la chaîne de format
%*[^\n]%*c
pour avaler le reste de la ligne d'entrée à partir d'un fichier. Par exemple, on peut lire un certain nombre et jetez le reste de la ligne par%d%*[^\n]%*c
. Ceci est utile si il y a un commentaire ou une étiquette suivant le nombre, ou d'autres données qui ne sont pas nécessaires.OriginalL'auteur MarkP
Espère que cela aide ... en fait, "\n" reste dans le flux de la mémoire tampon d'entrée... Ee besoin de rincer avant le scanf est de nouveau appelé
OriginalL'auteur Code-Zing