Оператор массива ассоциативен.
А [8] является синонимом для * (+ 8). Так как дополнение ассоциативно, который может быть переписан как * (8 + A), который является синонимом для..... 8
Вы не сказали полезный...:-)
Когда вы читаете ввод с клавиатуры с помощью scanf ()
, ввод считывается после нажатия клавиши ввода, но новая строка, сгенерированная клавишей ввода, не используется при вызове scanf ()
. Это означает, что в следующий раз, когда вы будете читать из стандартного ввода, вас будет ждать новая строка (которая заставит следующий вызов scanf ()
немедленно вернуть без данных).
Чтобы избежать этого, вы можете измените свой код на что-то вроде:
scanf("%c%*c", ¤tGuess);
% * c
соответствует одному символу, но звездочка указывает, что этот символ нигде не будет сохранен. Это приводит к использованию символа новой строки, сгенерированного клавишей ввода, так что при следующем вызове scanf ()
вы начинаете с пустого буфера ввода.
Предостережение: Если пользователь нажимает две клавиши, а затем вводит, scanf ()
вернет первое нажатие клавиши, съест второе и оставит новую строку для следующего вызова ввода. Подобные причуды - одна из причин того, почему многие программисты избегают scanf ()
и его друзей.
При первом прохождении цикла scanf () считывает символ. Затем он читает новую строку. Затем он читает следующий символ; повторить.
Я редко использую scanf (), но если вы используете строку формата «%. 1s»
, она должна пропускать пробелы (включая символы новой строки), а затем читать символ, отличный от пробела. Однако он будет ожидать массив символов, а не одиночный символ:
char ibuff[2];
while ((scanf("%.1s", ibuff) == 1)
{
...
}
Разбейте проблему на более мелкие части:
int main(void) {
char val;
while (1) {
printf("enter val: ");
scanf("%c", &val);
printf("got: %d\n", val);
}
}
Вот результат:
enter val: g
got: 103
enter val: got: 10
Почему scanf
даст вам еще одну «10»?
Поскольку мы напечатали номер ASCII для нашего значения, «10» в ASCII означает «ввод», поэтому scanf
должен также использовать клавишу «ввод» в качестве символа.
Конечно же, глядя на ваш ] scanf
строка, вы запрашиваете один символ каждый раз в вашем цикле. Управляющие символы также считаются персонажами и будут взяты. Например, вы можете нажать «esc», затем «enter» в указанном выше цикле и получить:
enter val: ^[
got: 27
enter val: got: 10
Просто предположение, но вы вводите один символ с помощью scanf, но пользователь должен ввести предположение плюс новую строку, которая используется как отдельный символ предположения.
Я заметил пару замечаний:
scanf ("% c")
прочитает 1 символ и сохранит ENTER во входном буфере для следующего раза в цикле i
, даже если символ, прочитанный от пользователя, не соответствует символу в secretWord
покрыто [j]
когда-либо становится » - '? Джим и Джонатан правы.
Чтобы заставить вашу строку scanf делать то, что вы хотите (использовать символ новой строки, не помещая его в буфер), я бы изменил его на
scanf("%c\n", ¤tGuess);
(обратите внимание на \ n
)
Однако обработка ошибок здесь ужасна. По крайней мере, вы должны проверить возвращаемое значение scanf на значение 1 и игнорировать ввод (с предупреждением), если он его не возвращает.
Я предполагаю: ваш код обрабатывает новую строку как одну из догадок при вводе данных. Я всегда избегал семейства * scanf () из-за неконтролируемой обработки ошибок. Попробуйте вместо этого использовать fgets (), затем вытащите первый символ / байт.
Я вижу в вашем коде пару вещей: