web-dev-qa-db-fra.com

Lire pas plus que la taille de la chaîne avec scanf ()

Edit: pour ma classe, je dois utiliser scanf. Donc, recommander d'autres modes de saisie n'est pas la solution que je recherche (s'il y en a un qui implique scanf).


Si je lis des entrées utilisateur pour un petit projet (par exemple, un jeu). Disons que je demande would you like to play? Cela accepterait une réponse yes ou no. J'écris donc du code simple comme celui-ci:

#include <stdio.h>

int main(void)
{
     char string[3]; //The max number of letters for "yes".

     printf("Would you like to play?");
     scanf("%s", string);
}

Donc, ce code devrait simplement leur demander de saisir yes ou no. Je fixe la durée de mon char array à la taille 3. De cette façon, il est assez grand pour contenir yes et aussi no. Mais si quelqu'un devait entrer une entrée non valide telle que yesss, je sais comment comparer la chaîne par la suite pour gérer un tel événement, mais cela n'écraserait-il pas techniquement/éventuellement d'autres variables locales que j'ai déclarées car elles s'étendent en dehors de la longueur de mon tableau? Si oui, existe-t-il un moyen de gérer cela pour restreindre 3 caractères d'entrée ou quelque chose? Et sinon, pourquoi/comment sait-il ne saisir que pour la taille de 3?

* Remarque: je suis nouveau sur C et je n'ai pas trouvé grand-chose à ce sujet, donc je l'apprécie même si c'est simple. Parce que je manque clairement quelque chose. Je viens d'un Java background où cela ne serait même pas un problème.

26
MrHappyAsthma

Votre tableau doit pouvoir contenir quatre char, car il doit également contenir la terminaison 0. Avec cela fixe, en spécifiant une longueur maximale dans le format,

scanf("%3s", string);

garantit que scanf ne lit pas plus de 3 caractères.

34
Daniel Fischer

le moyen le plus sûr est d'utiliser

fgets (chaîne, 4, stdin);

ici, vous pouvez stocker au maximum 3 caractères, dont un espace réservé pour le caractère NULL ('\ 0').

10
Timothy Malche

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

utilisez le modificateur "largeur";

%[*][width][modifiers]type
4
anonymous

Vous devez utiliser le modificateur width de scanf() et le définir sur une de moins que la taille de votre chaîne, afin de vous assurer que l'espace existe pour le terminateur NULL.

Donc, si vous voulez stocker "oui", vous aurez d'abord besoin d'un tableau plus grand que celui que vous avez; un de taille 4, 3 caractères plus 1 pour le terminateur nul. De plus, vous devez demander à scanf() de ne pas lire plus de taille - 1 caractères, où taille est la longueur de votre tableau, donc 3 dans ce cas, comme ceci:

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
4
gsamaras