Неправильное подключение с помощью% с
Рассмотрим следующий фрагмент кода:
int main(){
int x;
char y;
scanf("%d", &x);
scanf("%c", &y);
printf("%d %c", x, y);
}
Поведение:
При выполнении указанной выше программы, то первый зсапЕ называется , который будет ждать ввода десятичного числа. Скажем, вы вводите 12 (Это ASCII '1' и ASCII '2'). Затем вы нажимаете клавишу «enter» на , сигнализируя о конце ввода. Затем программа выполнит второй scanf, за исключением того, что вы не заметите, что программа не ждет вас до , введите символ и вместо этого перейдите прямо к выходу 12, затем следуйте с помощью '\ n'.
Объяснение:
Почему это происходит? Давайте посмотрим на поведение программы шаг за шагом. Изначально в буфере ничего нет. Когда вызывается первый scanf(), он не имеет ничего , чтобы читать, и поэтому он ждет. Он продолжает ждать, пока вы не наберете 1,2, затем введите «enter». Теперь, что находится в , буфером являются символ 1, символ 2 и символ '\ n'. Помните, что «\ n» обозначает конец ввода, как только все поля были введены, но также сохраняется в буфере в виде символа ASCII. На этом этапе scanf будет считывать самый большой десятичный ввод из буфера и преобразовывать его в целое число. В этом примере он находит строку «12», а преобразует ее в десятичное значение двенадцать и помещает ее в x. Затем scanf возвращает управление обратно на на главную функцию и возвращает значение 1, чтобы иметь возможность успешно конвертировать одну запись . В нашем примере мы не поймаем возвращаемое значение scanf в переменной. Для надежного кода важно проверить возвращаемое значение scanf(), чтобы убедиться, что пользователь вводит правильные данные.
Что сейчас осталось в буфере «\ п». Затем второй scanf вызывает , и он ожидает персонажа. Поскольку в буфере уже есть символ '\ n', scanf видит это, берет его из буфера и помещает его в y. Поэтому при выполнении printf после этого на экран выводятся цифры 12 и "enter".
Решение:
Мораль рассказа, введите это символ, как и любой другой, и вводится в буфер, и потребляются из буфера на% с просто как любой другой символ ASCII. Чтобы исправить это, попробуйте использовать этот код вместо:
int main(){
int x;
char y;
scanf("%d", &x);
scanf("\n%c", &y); /* note the \n !! */
printf("%d %c", x, y);
}
**
Как это исправить эту проблему?
** Таким образом, вы снова ввести «1»,»2’ ,» \ п». Первый scanf читает «1» и «2», преобразует их в десятичные двенадцать и оставляет «\ n» в буфере. Следующий scanf теперь ожидает '\ n' в начале следующего ввода. Он находит «\ n» в буфере, читает его и отбрасывает. Теперь буфер пуст, и scanf ждет пользователя для ввода символа. Произнесите пользовательские входы 'c', а затем введите ключ. 'C' теперь , присвоенный y, NOT "enter". Поэтому printf выводит «12 c» на экран . ПРИМЕЧАНИЕ. В очереди теперь есть «\ n». Поэтому, если вам нужно сделать еще один scanf для одного символа, вам нужно будет «потреблять», что «\ n» перед тем, как взять другого пользователя от пользователя.
Это не является проблемой для любого другого спецификатора формата, так как все они игнорируют пробелы до входе.
Какой тип ''% c'' вы имеете в виду? –
И каков правильный выход? Каков результат, который предоставляет программа? –
@JeffMercado, обновил мой вопрос. Я говорю об утверждении scanf. –