2016-11-11 5 views
4

Я просто спрашиваю, что делает getchar в этом коде и как он работает? Я не понимаю, почему getchar влияет на код, мне кажется, что он просто получает значение, но ничего не делается со значением.C code, scanf и getchar

int c=0; 
while (c>=0) 
{ 
    scanf("%d", &c); 
    getchar(); 
} 
+2

Подсказка: попробуйте с типом 'char'. Здесь это избыточно. –

+0

отлично спасибо – james

ответ

0

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

scanf будет считывать целое число и помещать его в переменную c.

GetChar читает в следующем символе (предполагается, что новая линия)

Поскольку он не проверяет, есть некоторый потенциал, что это не новая линия, или что зсапЕ не удалась, как то, что он пытался читать, не было числа.

3

Некоторые возможности почему getchar() могли быть использованы там:

1) Если это сделано, чтобы игнорировать пробельные (обычно используется при сканировании символов с %c), это не нужно, потому что здесь %d игнорирует пробельные в любом случае.

2) Другая возможность заключается в том, что после того, как этот цикл, некоторое дальнейшее сканирование выполняется, когда последний \n оставленный последнего вызова scanf() может быть проблемой. Таким образом, getchar() может использоваться для его игнорирования.

3) В случае ввода символов не совпадают %d, scanf() не удастся. В том, что введенные вами символы остаются во входном потоке, и вы никогда не сможете снова прочитать int (например, если вы вводите abcdddgdfg без этого вызова getchar()). Таким образом, getchar() здесь будет потреблять все эти символы (по одному на итерацию), и в итоге вы сможете прочитать int (с использованием %d).

Но это все не нужно; это всего лишь попытка исправить ошибки scanf(). Чтение входов с использованием scanf() и получение его правильно - действительно сложно. Поэтому всегда рекомендуется использовать fgets() и анализировать с помощью sscanf() или использовать функции strto*(), если вы просто сканируете целые числа.

См: Why does everyone say not to use scanf? What should I use instead?

+0

Хорошие точки и выводы. – chux

1

В этом коде getchar вызывается для его побочных эффектов: он читает символ из стандартного ввода и выбрасывает его.

Возможно, это считывает ввод от пользователя. scanf будет потреблять число, но оставить символ новой строки после номера нетронутым. getchar потребляет новую строку и отбрасывает ее. Это не является строго необходимым в этом цикле, потому что следующийscanf пропустит пробел, чтобы найти следующий номер, но может быть полезно, если код после цикл не ожидает, что новая строка станет первой вещь на stdin.

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

char *linep = 0; 
size_t asize = 0; 
char *endp; 
long c; 
while (getline(&linep, &asize, stdin) > 0) { 
    errno = 0; 
    c = strtol(linep, &endp, 10); 
    if (linep == endp || *endp != '\0' || errno) { 
     puts("?Redo from start"); 
     continue; 
    } 
    if (c == 0) break; 
    do_something_with(c); 
} 
free(linep); 
0

getchar(); просто чтение и потребляющих характер после того, как числа, будь то пробел, запятая, новую линию или начало другого целого или что-нибудь еще.

ИМО, это не прочный код. Хороший код: 1) по крайней мере проверить результат scanf() и 2) проверить или ограничить потребление следующего символа, чтобы предотвратить «есть» потенциальный знак следующего номера. Помните, что код не может контролировать то, что пользователь вводит, но должен справиться с тем, что было введено.

v space 
"123 456" 

    v comma 
"123,456" 

    v negative sign 
"123-456" 
Смежные вопросы