Я новичок в языке программирования C. В качестве компилятора у меня GCC 6.3.0, а для записи использую Notepad++ 8.5.7.0. У меня нет IDE. Итак, я написал свою первую программу на NP++, которая
#include<stdio.h>
int main(){
printf("Hello World!");
return 0;
}
Эта программа завершалась, не имея возможности прочитать вывод, поэтому мне нужно было каким-то образом добавить некоторую задержку, чтобы увидеть вывод программы.
Погуглив некоторое время, я наткнулся на функцию delay(ms). Я пытался использовать его:
#include<stdio.h>
#includ<stdlib.h>
int main(){
printf("Hello World!");
delay(2500);
return 0;
}
Я ожидал, что это добавит задержку в 2,5 секунды перед завершением. Но вместо этого GCC при компиляции выдал следующую ошибку:
Hello.c: In function 'main':
Hello.c:21:5: warning: implicit declaration of function 'delay' \[-Wimplicit-function-declaration\]
delay(2500);
^\~\~\~\~
C:\\Users\\PC\\AppData\\Local\\Temp\\ccDQtRCK.o:Hello.c:(.text+0xd0): undefined reference to \`delay'
collect2.exe: error: ld returned 1 exit status
в котором говорится, что функция задержки не определена, насколько я понимаю.
Затем я наткнулся на этот блок кода:
int c, d;
for (c = 1; c <= 32767; c++)
for (d = 1; d <= 32767; d++)
{}
который в основном выполняет очень длинный цикл for. Это добавляет заметную задержку после программы, однако это сводит с ума мой процессор и вентиляторы, вероятно, из-за того, что происходит все это приращение. Есть ли другие способы добавить задержку в мою программу?
Функции delay() нет, но есть sleep(): geeksforgeeks.org/sleep-function-in-c/#
Попросите пользователя ввести данные, например. «Пожалуйста, нажмите Enter, чтобы продолжить...» или что-то подобное, и используйте char buffer[100]; fgets(buffer, sizeof buffer, stdin);
В Windows вы можете сделать что-то вроде system("pause") Я думаю.
@Someprogrammerdude Или просто getchar();. Не то чтобы пользователь заботился о получении ввода.
Безусловно, большинство программ без графического интерфейса не ждут, пока пользователь подтвердит свое завершение. Вместо этого вы запускаете их из командной строки и у вас есть достаточно времени, чтобы прочитать их вывод. На самом деле пользователи сильно беспокоятся, если вы реализуете задержку или подтверждение.
Делать задержку программы перед выходом — это совершенно ненормально. Как вам уже говорили другие, исправьте способ запуска, чтобы окно не закрывалось сразу после завершения, не пытайтесь заставить программу отложить завершение. Если вы запустите практически любой встроенный инструмент командной строки, поставляемый с Windows, например dir, вы увидите, что они делают то же самое, что и ваша программа, потому что это нормальное ожидаемое поведение.





getchar() — это самый портативный способ добавить паузу в обработке, который я знаю. getchar() ждет нажатия клавиши *, прежде чем продолжить выполнение. Этот код был скомпилирован и протестирован мной перед публикацией. Пожалуйста, попробуйте.
*EDIT: в частности, необходимо нажать клавишу ENTER. Обратите внимание, что getch() (в conio.h) принимает любое нажатие клавиши, но оно доступно не на всех платформах.
В зависимости от платформы существуют другие способы задержки обработки. В старых 16-битных компиляторах Borland есть delay(). Современные компиляторы Microsoft имеют Sleep(). Оба принимают параметр в миллисекундах. Для платформы Linux функция sleep() принимает параметр в секундах.
Если вы используете одну из этих платформ, просто замените вызов getchar() соответствующей функцией из списка, который я только что описал, если вы предпочитаете задержку по времени нажатию клавиши.
#include<stdio.h>
int main()
{
printf("Hello World!\n");
getchar();
return 0;
}
getchar() ждет, пока вы нажмете Enter, чтобы продолжить выполнение кода, а не нажатие любой клавиши... Например, если вы нажмете буквенную или цифровую клавишу, он фактически введет текст ключа в командной строке, вместо того, чтобы продолжать выполнение инструкций программы.
@isrnick -- да, правда. Спасибо за этот полезный комментарий.
Если во входном потоке остался символ новой строки (например, в результате использования scanf), то использование getchar не приостановит программу. Оно вернется немедленно. Поэтому я боюсь, что это решение не будет надежно работать во всех ситуациях.
@AndreasWenzel - тоже правда. Все: Обратите внимание: getchar() — это лишь один из многих вариантов, обсуждаемых в моем ответе/решении. getchar() был выделен потому, что он портативен и, как и многие портативные решения, имеет существенные недостатки. Лучшим решением, вероятно, будет другой вариант, который я представил, но тот, который соответствует выбранной платформе.
Сообщение об ошибке, которое вы видите, говорит о том, что в вашей области функция delay не определена (она не существует).
Вместо этого вы можете использовать функцию sleep, определенную в unistd.h, если вы используете Linux, или windows.h, если вы используете Windows (обратите внимание, что поведение функции может меняться на разных платформах).
Вы можете использовать его следующим образом:
#include <stdio.h>
#include <unistd.h> // this example will work on Linux
int main() {
printf("Hello World!");
// suspend execution for 2 seconds
sleep(2);
return 0;
}
В то время как в Windows функция сна принимает в качестве аргумента миллисекунды, в Linux функция sleep принимает в качестве аргументов только целые числа (это означает, что вы сможете приостановить выполнение только на целые секунды, а не на полсекунды). В конце концов, если вы хотите подождать определенное время в миллисекундах в Linux, вы можете реализовать что-то вроде этого, используя функцию usleep:
#include <stdio.h>
#include <unistd.h> // this example will work on Linux
void sleep_ms(int milliseconds) {
// Convert milliseconds to microseconds
usleep(milliseconds * 1000);
}
int main() {
printf("Hello World!");
sleep_ms(2500);
return 0;
}
Для получения дополнительной информации об этой функции вы можете перейти на эту страницу.
Я использую Windows, но когда я включил <windows.h>, возникла ошибка. И все работало нормально, когда я включил <unistd.h>. Странный. Но это сработало, так что большое спасибо за вашу помощь!
@SinanMertUluçay, это действительно зависит от типа среды, в которой вы находитесь, и типа используемого компилятора. Я сама студентка, всегда рада помочь другим!
Как говорит @gregspears, getchar() — это то, что вам нужно, если вы хотите решить эту проблему в своем коде.
Мой совет — настройте свой терминал так, чтобы он не закрывался после завершения программы.
Другие показали вам несколько способов приостановить или добавить задержку в вашу программу.
Однако правильный способ запуска программ командной строки — выполнить их на терминале. Таким образом, ваша программа будет печатать свои выходные данные на терминале, на котором вы ее выполняете, оставаясь на экране терминала даже после того, как программа завершит свое выполнение. Это означает, что в вашу программу не нужно добавлять паузы или задержки.
В случае с Windows вы обычно запускаете его в терминалах командной строки (cmd.exe) или Powershell (powershell.exe). И я считаю, что наиболее практично это сделать: перейти к папке программы в окне проводника, а затем щелкнуть панель навигации по пути в проводнике, ввести cmd и нажать Enter, чтобы открыть терминал командной строки непосредственно в папке. где ваша программа.
Затем вам просто нужно ввести имя исполняемого файла вашей программы в терминале и нажать Enter, чтобы запустить его.
C:\path\to\your\programs\folder>helloworld.exe
Просто запустите программу из командной строки, а не из окна проводника (что, я предполагаю, вы и делаете).