2014-01-14 2 views
0

Я беру курс программирования C. Я не понял эти коды.С помощью Scanf после getchar?

#include <stdio.h> 
int main() 
{ 
    int c; 
    int ival; 
    printf("type : "); 
    c = getchar(); 
    scanf("%d", &ival); 
    printf("c  = %d\n", c); //65 
    printf("ival = %d\n", ival); //127 
    return 0; 
} 

Например, когда я типа Abc, я получаю с = 65; ival = 1. Почему ival составляет 1?

ответ

5

ival не инициализирован, поэтому он может иметь любое значение. Причина заключается в том, что, c получает 'A' (через getchar()), а затем scanfне удается прочитать номер (со следующего символа на входе, 'b', не десятичное число), поэтому он никогда не коснется ival.

Вы можете проверить возвращаемое значение scanf, чтобы увидеть, если он выходит из строя или преуспевает:

if (scanf("%d", &ival) != 1) 
    printf("you need to enter a number\n"); 
else 
    printf("entered: %d\n", ival); 

Обратите внимание, что scanf возвращает количество элементов успешно считанных и присвоенных. Например, scanf("%d %f %c", ...) вернет 3, если все три элемента были правильно прочитаны.


Обратите внимание, что назначен означает, что игнорируемый вход (например, с помощью модификатора присвоения гасящего (*)) не учитывается возвращаемым значение scanf (C11, 7.21.6.2.10,16). Кроме того, %n не влияет на возвращаемое значение scanf (C11, 7.21.6.2.12).

+2

небольшая коррекция: 'scanf' возвращает количество успешно сопоставленных элементов * и *. Концепция отличается; если вы используете '% * s', это не будет считаться с окончательным значением возврата, но оно могло бы прочитать его правильно. –

+0

Благодарим вас за ответ. – ahmetlutfu

+0

@ FilipeGonçalves, вы абсолютно правы. Я добавил эту информацию. – Shahbaz

0

Причина в том, что ваша программа вызывает неопределенное поведение. A читает getchar, а bc остается непрочитанным scanf, потому что %d ожидает читать целое число и, следовательно, при встрече персонажа он немедленно прекращает чтение и оставляет ival неинициализированным.

2

С Abc, getchar() прочтет A, таким образом, c будет содержать код символа для A, который бывает 65 на вашей машине (это ASCII код A).

Для ival, вы можете получить что-нибудь: так %d на scanf() ожидает читать целое число, и вы не предоставили один, scanf() вернулся преждевременно, оставив bc во входном буфере, так что значение, которое вы читали из ival, когда вы вызов printf() не определен: он может печатать что угодно.

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