Читайте не больше, чем размер строки с 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').
Ответ 3
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
используйте модификатор "width",
%[*][width][modifiers]type
Ответ 4
Вы должны использовать модификатор ширины scanf()
и установить его на один меньше, чем размер вашей строки, чтобы вы убедитесь, что пространство существует для терминатора NULL
.
Итак, если вы хотите сохранить "да", вам сначала понадобится больший массив, чем тот, который у вас есть; один с размером 4, 3 символа плюс 1 для нулевого терминатора. Кроме того, вы должны проинструктировать scanf()
читать не более размера - 1 символ, где размер - длина вашего массива, таким образом, 3 в этом случае, например:
#include <stdio.h>
int main(void)
{
char string[4];
scanf("3%s", string);
}