Читайте не больше, чем размер строки с scanf()

Изменить: для моего класса я должен использовать 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. Я устанавливаю длину моего char array в размере 3. Таким образом, он достаточно велик, чтобы удерживать yes, а также no. Но если кто-то должен был ввести недопустимый ввод, такой как yesss, я знаю, как впоследствии сравнить строку для обработки такого события, но не будет ли это технически/возможно перезаписать другие локальные переменные, которые я объявил, потому что он будет выходить за пределы длины моего массива? Если да, есть ли способ справиться с этим, чтобы ограничить 3 вводных символа или что-то еще? А если нет, то почему/как он знает только вход для размера 3?

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

Ответ 1

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

scanf("%3s", string);

гарантирует, что scanf читает не более 3 символов.

Ответ 2

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

<сильные > fgets (строка, 4, STDIN);

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

Ответ 4

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

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

#include <stdio.h>

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