D'entrée de chaîne à l'aide de C scanf_s
J'ai essayé de regarder pour la réponse moi-même, mais je ne peux pas en trouver un.
Je veux insérer une partie de la programmation qui lit une chaîne de caractères comme "Bonjour" et les magasins et peut afficher, quand je veux, de sorte que printf("%s", blah);
produit Hello
.
Voici la partie de code qui me fait mal
char name[64];
scanf_s("%s", name);
printf("Your name is %s", name);
Je sais que printf
n'est pas le problème; le programme se bloque après quelque chose est entrée après une invite de commandes. S'il vous plaît aider?
Le "sécuriser" la version de
Utilisez simplement
Avez-vous une trace de la pile pour la même chose? Si oui, merci de la poster.
Si vous utilisez
Cela a fonctionné pour moi: stackoverflow.com/a/17067317/830514, je suis en utilisant VS 2013, C du programme.
scanf
exige que vous offre la longueur de la mémoire tampon.Utilisez simplement
scanf()
, au lieu de cette scanf_s()
. Ou, encore mieux, fgets()
.Avez-vous une trace de la pile pour la même chose? Si oui, merci de la poster.
Si vous utilisez
scanf
vous devez spécifier la longueur afin d'éviter un débordement de la mémoire tampon: scanf("%63s", name);
Cela a fonctionné pour moi: stackoverflow.com/a/17067317/830514, je suis en utilisant VS 2013, C du programme.
OriginalL'auteur user3587529 | 2014-04-30
Vous devez vous connecter pour publier un commentaire.
À partir de la spécification de
fscanf_s()
à l'Annexe K. 3.5.3.2 de la norme ISO/IEC 9899:2011 standard:et:
MSDN dit des choses similaires (
scanf_s()
etfscanf_s()
).Votre code ne fournit pas l'argument de longueur, de sorte que certains autre numéro est utilisé. Il n'est pas déterminée, la valeur qu'il trouve, de sorte que vous obtenez comportement excentrique à partir du code. Vous avez besoin de quelque chose de plus comme cela, où le retour à la ligne permet de s'assurer que la sortie est en fait vu.
scanf_s
être jeté à(unsigned int)
commesizeof
renvoie une valeur de typesize_t
?Si vous allez à la lancer, elle devrait être lancé à
rsize_t
(voir la citation dans la réponse), mais K. 3.3 définitions Communes<stddef.h>
dit (dans son intégralité): L'en-tête <stddef.h> définit un type.Le type estrsize_t
qui est le typesize_t
. et références de la note de bas de page 385, qui dit: Voir la description de laRSIZE_MAX
macro dans<stdint.h>
. La discussion deRSIZE_MAX
est beaucoup plus vaste, mais l'intention est qu'il devrait normalement être inférieure àSIZE_MAX
, avecSIZE_MAX >> 1
être d'une taille suggérée.OriginalL'auteur Jonathan Leffler
Je l'utilise très souvent dans mes cours à l'université, donc cela devrait fonctionner correctement dans Visual Studio (testé dans VS2013):
Ref: https://msdn.microsoft.com/en-us/library/w40768et.aspx
OriginalL'auteur NoobBG
"& " n'est pas nécessaire ici. Le nom du tableau lui-même donnera l'adresse de la table.
Le
&
sur&name
ne fait pas de mal, mais n'est pas nécessaire. La laisser de côté, parce que vous comprenez la relation entre les tableaux et les pointeurs. Si vous ne pas comprendre cette relation aller lire à ce sujet et ensuite laisser l'extra&
off.Hmmm ... peut-être tort sur le pointeur de la conversion. Dans ce cas, un hypothétique compilateur qui stocke des pointeurs de tableaux différemment des autres pointeurs pourrait montrer un comportement différent.
La notation
&name
génère unchar (*)[64]
dans le contexte de la question (char name[64];
). Le%s
format attend unchar *
, et se contente de renvoyername
donne unechar *
. Comme vous pouvez le voir, les deux types sont radicalement différents. La malheureuse curiosité est que la valeur de&name
considéré comme unvoid *
est la même que la valeur dename
considéré comme unvoid *
. Cela permetscanf("%63s", &name)
à "travailler", mais ne pas l'empêcher d'être incorrect.OriginalL'auteur wilson
Ah, oui. Un extrait de code sans contexte et de ne pas répondre à la question. Brillant.
OriginalL'auteur Sai Teja
ce faire, vous devez :
scanf ("%63s", name);
J'ai essayé et cela a fonctionné, #include <stdio.h> int main(void) { char nom[64]; scanf ("%63s", nom); printf("Votre nom est %s", nom); return 0; }
Je suis à l'aide de Visual Studio et il ne me laisse pas utiliser scanf, juste scanf_s, mais même avec le tampon, ça ne marchera pas, tout saute le %s dans le printf par la suite.
vous avez commencé un projet visual c++?
allez à propriétés de Projet->Propriétés de Configuration->C/C++->Préprocesseur->Définitions de Préprocesseur, cliquez sur modifier et ajouter des _CRT_SECURE_NO_WARNINGS cliquez sur ok, appliquer les paramètres et exécuter le projet
OriginalL'auteur M-N