Читать не более размера строки с помощью scanf()

Edit: для моего класса я должен использовать scanf. Поэтому рекомендация других способов ввода не является решением, которое я ищу (если есть один, который включает scanf).


если я читаю в пользовательском вводе для небольшого проекта (например, игры). Допустим, я спрашиваю would you like to play? это принять yes или no ответ. Поэтому я пишу такой простой код:

#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);
}

поэтому этот код должен просто попросить их ввести yes или no. Я установка длины my char array в размере 3. Таким образом, он достаточно большой, чтобы держать yes и no. Но если кто-то должен был ввести недопустимый ввод, такой как yesss, Я знаю, как сравнить строки после обработки такого события, но не будет ли это технически возможно перезаписать другие локальные переменные я заявил, что он будет распространяться за пределы длины массива? Если да, есть ли способ справиться с этим, чтобы ограничить 3 входных символа или что-то еще? А если нет, то почему / как не знаю только вход для размера 3?

*примечание: Я новичок в C и я не мог найти много на это, поэтому я ценю это, даже если это просто. Потому что мне явно чего-то не хватает. Я пришел из Java-фон, где это даже не будет проблемой.

4 ответов


Ваш массив должен иметь возможность держать четыре chars, так как он также должен содержать 0-Терминатор. При этом фиксируется, указывая максимальную длину в формате,

scanf("%3s", string);

обеспечивает scanf читает не более 3 символов.


самый безопасный способ-использовать

fgets (строка, 4, stdin);

здесь вы можете хранить максимум 3 символа, включая одно пространство, зарезервированное для символа NULL ('\0').


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

используйте модификатор "width";

%[*][width][modifiers]type

вы должны использовать ширина модификатор scanf() и установите его на меньше чем размер строки, так что вы убедитесь, что пространство существует для NULL Терминатор.

Итак, если вы хотите сохранить "да", вам сначала понадобится больший массив, чем тот, который у вас есть; один с размером 4, 3 символа плюс 1 для нулевого Терминатора. Более того, вы должны проинструктировать scanf() читать не более размер - 1 символы, где size-длина вашего массива, таким образом, 3 в этом случае, например:

#include <stdio.h>

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