2014-09-20 3 views
2

Вкратце мой код,Характер в зсапЕ («% d», & значение)

#include <stdio.h> 
int main() 
{ 
    int n; 
    scanf("%d", &n); 
    while(n != 0) 
    { 
     scanf("%d", &n); 
     printf("%d\n", n); 
    } 
    return 0; 
} 

Она была написана для integer ввода. Но если я введу вместо character (хотя n угасает как integer), цикл становится бесконечным и печатает последнее значение integer. Если я сначала вводя character, он, похоже, печатает адрес памяти. Мой вопрос: что происходит здесь, если я ввожу character вместо integer?

+0

@ ricky2527 почему вы думаете, что? он имеет условие нарушения. –

+0

Программа, кажется, завершает себя, когда вводится символ, вы уверены, что код правильный? –

+0

@darknight да, я уверен. Попробуйте запустить его в компиляторе 'gcc' с терминала. –

ответ

2

Фактически, когда другой символ был вставлен, он не будет использоваться как вход, он присутствует во входном буфере, он не может быть прочитан управляющей строкой.

Контрольная строка %d используется для чтения символа целого числа до других символов.

При вводе другого символа из-за отсутствия ничего цикла цикл непрерывно работает и печатает существующее значение переменной.

0

scanf("%d", &n); означает только получить данные числа из стандартного ввода, такие как 1, 2.

Таким образом, если вы наберете char во втором входе, такие как «а», «б», входной символ не хранится в &n. n все еще имеет данные первого ввода.

Следовательно, приходит бесконечный цикл.

+0

Если символ не сохраняется, то буфер ввода должен содержать нуль, что означает, что цикл не выполняется вообще. –

2

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

Я твердо верю, что первый scanf содержит % c как спецификатор формата.
Вы можете избавиться от бесконечного цикла по

if(scanf("%d",&n)==0) break;

Смежные вопросы