Scanf пропускает любой цикл с условием продолжения в C

Оператор массива ассоциативен.

А [8] является синонимом для * (+ 8). Так как дополнение ассоциативно, который может быть переписан как * (8 + A), который является синонимом для..... 8

Вы не сказали полезный...:-)

16
задан dave 31 October 2016 в 05:59
поделиться

8 ответов

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

Чтобы избежать этого, вы можете измените свой код на что-то вроде:

scanf("%c%*c", &currentGuess);

% * c соответствует одному символу, но звездочка указывает, что этот символ нигде не будет сохранен. Это приводит к использованию символа новой строки, сгенерированного клавишей ввода, так что при следующем вызове scanf () вы начинаете с пустого буфера ввода.

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

21
ответ дан 30 November 2019 в 16:05
поделиться

Новые строки.

При первом прохождении цикла scanf () считывает символ. Затем он читает новую строку. Затем он читает следующий символ; повторить.

Как исправить?

Я редко использую scanf (), но если вы используете строку формата «%. 1s» , она должна пропускать пробелы (включая символы новой строки), а затем читать символ, отличный от пробела. Однако он будет ожидать массив символов, а не одиночный символ:

char ibuff[2];

while ((scanf("%.1s", ibuff) == 1)
{
    ...
}
8
ответ дан 30 November 2019 в 16:05
поделиться

Разбейте проблему на более мелкие части:

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
5
ответ дан 30 November 2019 в 16:05
поделиться

Просто предположение, но вы вводите один символ с помощью scanf, но пользователь должен ввести предположение плюс новую строку, которая используется как отдельный символ предположения.

3
ответ дан 30 November 2019 в 16:05
поделиться

Я заметил пару замечаний:

  • scanf ("% c") прочитает 1 символ и сохранит ENTER во входном буфере для следующего раза в цикле
  • вы увеличиваете i , даже если символ, прочитанный от пользователя, не соответствует символу в secretWord
  • , когда покрыто [j] когда-либо становится » - '?
1
ответ дан 30 November 2019 в 16:05
поделиться

Джим и Джонатан правы.

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

scanf("%c\n", &currentGuess);

(обратите внимание на \ n )

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

2
ответ дан 30 November 2019 в 16:05
поделиться

Я предполагаю: ваш код обрабатывает новую строку как одну из догадок при вводе данных. Я всегда избегал семейства * scanf () из-за неконтролируемой обработки ошибок. Попробуйте вместо этого использовать fgets (), затем вытащите первый символ / байт.

1
ответ дан 30 November 2019 в 16:05
поделиться

Я вижу в вашем коде пару вещей:

  1. scanf возвращает количество прочитанных элементов. Вы, вероятно, захотите обработать случаи, когда он возвращает 0 или EOF.
  2. Я предполагаю, что пользователь нажимает букву + Enter, и вы получаете новую строку как второй символ. Простым способом проверки было бы добавление отладочного оператора printf, чтобы показать, какой символ был введен.
  3. Ваш код будет соответствовать только первому вхождению совпадающей буквы, то есть если слово было "test", а пользователь ввел 't ', ваш код будет соответствовать только первому' t ', а не обоим. Чтобы справиться с этим, вам нужно настроить свой первый цикл.
0
ответ дан 30 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: