Comment puis-je vérifier la longueur de la saisie de l'utilisateur en C?
Je suis un peu nouveau sur C, et l'entrée de la lecture est vraiment déroutant moi. Je suis en train d'initialiser un tableau de taille 4, mais il arrive que l'utilisateur va entrer en entrée valide de 3. En Java, j'ai pu vérifier la longueur de l'entrée et ajouter des instructions conditionnelles, mais je ne suis pas sûr de savoir comment cela fonctionne dans C.
main(void){
char str[N];
int i;
for(i = 0; i < N; i++){
scanf("%c", &str[i]);
}
for(i = 0; i < N; i++){
printf("%c\n", str[i]);
}
}
Droit maintenant, si j'ai d'entrée de 4 ou plus, il fonctionne très bien. Si j'ai d'entrée de 3, il se casse. J'aimerais qu'il à gérer à la fois les 3 ou 4 caractères.
En fait, la racine du problème est: je suis en train d'essayer de trouver un moyen de C lire dans un 24-heures-le temps de l'horloge, et l'ajouter à un 24-heures-horloge durée. Je devrais être en train d'approcher ce une façon entièrement différente?
Merci,
OriginalL'auteur Kris | 2011-10-24
Vous devez vous connecter pour publier un commentaire.
La réponse courte est: vous ne pouvez pas.
À l'aide de
scanf()
est particulièrement dangereux en raison de cette si vous voulez lire une chaîne de caractères (%s
); si l'utilisateur saisit plus d'entrée que votre mémoire tampon peut contenir, vous avez un dépassement de tampon sur vos mains.fgets()
d'autre part, vous permet de spécifier le nombre maximum d'octets que vous lirez, vous empêchant de vous de débordement de la mémoire tampon.Voici un exemple rapide sur la façon dont vous voulez écrire une fonction pour une entrée qui a permis de vérifier que l'entrée était l'intérieur d'une certaine longueur et a une ligne complète (se terminant par
\n
- cette routine rejette le\n
à partir de l'entrée):for(i = 0; i < N; i++)
garantit aucun débordement?il fait, mais il peut essayer de lire trop, donc un spécificateur de largeur, c'est mieux.
Édité pour plus de clarté, je voulais le lire en une chaîne de caractères. Le problème, il a la lecture d'un personnage à un moment, c'est qu'il ne connaît pas l'entrée de longueur en plus, il est de ne pas traiter avec underfilling la mémoire tampon. Il init le char tableau de tous les '\0' et d'ajouter une case pour
\n
à la lecture de chaque, mais à mon humble avis, il est de loin préférable d'utiliser fgets et tout simplement d'être fait avec elle.OriginalL'auteur Brian Roach
scanf()
permet l'utilisation de la largeur maximale des prescripteurs:Donc
scanf("%3s", buffer)
lit à plus de 3 caractères + 1 NUL terminator.OriginalL'auteur ninjalj