Почему мой преподаватель, использующий два getchar ();? [закрытый]

См. также здесь: http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/06/26/fun-with-dbcc-chekident.aspx

Это - зарегистрированное поведение, почему Вы выполняете CHECKIDENT при воссоздании таблицы в этом случае пропустите шаг или используйте УСЕЧЕННЫЙ (если у Вас нет отношений FK)

6
задан innaM 19 October 2009 в 16:19
поделиться

11 ответов

The best better way is not to add any code to try and keep the console window open: start your program right from the console window.

If you must start your program from the IDE and want the program to not terminate before the user presses Enter, one single getchar() should do it.

The second best better way to make the program terminate after the user presses a key, is to always make sure there are no inputs pending and use one single getchar().

The reason your teacher uses 2 getchar(), I guess, is that there is already a character in the input buffer from previous inputs. To consume all characters from the inputs, up to and including the ENTER, this is usual:

int ch;
/* ... */
printf("Press Enter"); fflush(stdout);
while ((ch = getchar()) != '\n' && ch != EOF) /* void */;
15
ответ дан 8 December 2019 в 02:02
поделиться

Он ожидает ввода данных пользователем, чтобы вы могли видеть вывод программы, в противном случае он просто завершится и вывод не будет виден (в зависимости от ОС). Выньте это и попробуйте.

23
ответ дан 8 December 2019 в 02:02
поделиться

Он хочет, чтобы консоль оставалась открытой и ждала, пока пользователь нажмет клавишу. Думаю, вспомнить это зависит от того, что происходит в вашей программе профессора над "getchar ()". В буфере все еще может быть что-то, поэтому он добавил второй «getchar ()». Не самый элегантный способ решения проблемы.

Edit: Вот небольшой пример. В буфере все еще остается «\ n» от «scanf ()». Если вы добавите второй «getchar ()», вы получите ожидаемый результат. Вы должны очистить буфер перед "getchar ()".

#include <stdio.h>

main()
{
int input;
scanf("%d", &input);
printf("The input is %d\n", input);
getchar();
return 0;
}

Редактировать 2: Вот решение, взятое из здесь .

int c;
printf( "Press ENTER to continue... " );
fflush( stdout );
do c = getchar(); while ((c != '\n') && (c != EOF));
16
ответ дан 8 December 2019 в 02:02
поделиться

Причина, по которой многие новички считают необходимым поместить два вызова getch в свой код, заключается в том, что один единственный вызов часто не работает.

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

Конечно, это «решение» все равно не сработает во многих случаях, когда в очереди клавиатуры находится более одного символа. Лучшее решение - очистить эту очередь и , затем запросить следующий символ. К сожалению, насколько мне известно, в C / C ++ нет независимого от платформы способа сделать это. Обычный способ сделать это в C ++ (извините, мой C ограничен) выглядит следующим образом:

std::cin.ignore(std::cin.rdbuf()->in_avail());

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

5
ответ дан 8 December 2019 в 02:02
поделиться

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

найдите ему лучшее решение для этого (а не std :: cin), и вы станете героем день.

3
ответ дан 8 December 2019 в 02:02
поделиться

Почему мой проф использует два метода getchar (); в конце наших руководств по программе C?

Предположим, у вас есть что-то вроде

int main ( void )
{
    int     input;

    scanf ( "%d", &input );

    printf ( "The input is %d.\n", input );

    getchar();
    getchar();

    return 0;
}

Two, потому что scanf не вернется, пока не будет нажата клавиша ввода, но будет '\ n' из ввод и любые другие символы, которые вы ввели во входной буфер.

Таким образом, если вы запустите вышеуказанное и введете 1234 Введите , программа остановится после печати Ввод будет 1234 . пока вы не нажмете , введите еще раз. Первый getchar читает '\ n' , связанный с первым Enter . Если вы введете что-то еще, например 1234 Пробел Введите , программа не остановится, поскольку первый getchar прочитает пробел. Двух getchar может быть недостаточно, и вы вкрапили код для печати ответа в код для обработки ввода.

И каков «лучший способ» для этого?

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

fgets (чтение ввода до '\ n' или конца файла), за которым следует sscanf (синтаксический анализ строки для ввода), безопасен от переполнения буфера и поглощает любой дополнительный ввод и строку завершение '\ n':

#include <stdio.h>

int main ( void )
{
    int     input;
    char    buf[16] = "";

    fgets ( buf, sizeof buf, stdin );

    sscanf ( buf, "%d", &input );

    printf ( "The input is %d.\n", input );

    fflush ( stdout );

    getchar();

    return 0;
}

Очистка stdout после printf isn ' t обычно требуется для терминального ввода-вывода, но может быть, если вы подключаете его к диску (обычно, когда вы регистрируете сбойную программу, она теряет самый интересный бит непосредственно перед сбоем, если вы не сбрасываете).

Поскольку fgets считывает до конца строки включительно, в буфере не осталось символов, поэтому вам нужен только один getchar и немного неудобный ввод, например 1234 Пробел Ввод не приводит к завершению программы без паузы.

Однако в большинстве случаев вам не нужно ждать после запуска консольного приложения - в Linux или других системах Unix вы обычно открываете консоль и запускаете там программу, после чего управление возвращается оболочке. В Windows IDE, такие как Visual Studio, обычно запускают программу и приостанавливают ее , используя что-то вроде:

 "C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe"  & pause"

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

Вам действительно нужно сделать паузу только в том случае, если вы работаете в Windows и используете отладчик чтобы запустить его, и вы не установили никаких точек останова.

Вы используете отладчик для его запуска, и вы не установили никаких точек останова.

Вы используете отладчик для его запуска, и вы не установили никаких точек останова.

5
ответ дан 8 December 2019 в 02:02
поделиться

Скорее всего, чтобы оставить окно вывода открытым, когда вы запускаете программу из IDE.

... почему их два, я не понимаю.

1
ответ дан 8 December 2019 в 02:02
поделиться

Это наивное решение проблемы неиспользуемого буферизованного ввода. Ваш специалист распознает проблему, но, похоже, не знает, как ее решить.

Если вы используете форматированный ввод, используются только введенные символы, которые соответствуют спецификатору формата. Так, если, например, последний ввод запрашивал десятичное целое число с использованием% d, вы можете ввести в консоли:

123 <новая строка>

Отформатированный ввод будет использовать «123», оставив <новая строка> в буфере. Неформатированный ввод, такой как getchar (), будет использовать его и немедленно вернуть. Поскольку это не то, что вам нужно, ваш проф использовал «просто добавьте еще один кладж getchar ()». Это работает, только если пользователь вводит ожидаемый ввод. Неуклюжий машинист может набрать:

123w

Теперь первый getchar () получает 'w', второй - , и ваша программа завершается раньше, чем вы предполагали. к, и в среде графического интерфейса пользователя, если оконечный процесс владеет окном, в котором он запущен, тогда ОС закрывает его.

Более надежным решением является многократный вызов getchar () до тех пор, пока найдено:

while( getchar() != '\n' ) { /*do nothing*/} ;
getchar() ; /* wait */

Конечно, если предыдущий ввод был символом, вам нужно проверить, что это уже не было :

while( ch != '\n' && getchar() != '\n' ) { /*do nothing*/} ;
getchar() ; /* wait */

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

1
ответ дан 8 December 2019 в 02:02
поделиться

getchar (); в конце программы создает ситуацию «Нажмите любую клавишу для продолжения». Думаю, ему нравится дважды нажимать любую клавишу.

0
ответ дан 8 December 2019 в 02:02
поделиться

Чтобы получить оставшийся "\ n" из буфера, чтобы приложение закрылось.

0
ответ дан 8 December 2019 в 02:02
поделиться

Потому что одно нажатие кнопки «ввод» генерирует два символы в Windows, см. википедию . По крайней мере, его тоже использовали давным-давно в далекой галактике ...

-3
ответ дан 8 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

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