Я написал программу на C, которая печатает Hello World, но закрывается прежде, чем я успеваю увидеть результат. Как я могу добавить задержку, чтобы увидеть результат?

Я новичок в языке программирования 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. Это добавляет заметную задержку после программы, однако это сводит с ума мой процессор и вентиляторы, вероятно, из-за того, что происходит все это приращение. Есть ли другие способы добавить задержку в мою программу?

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

Eugene Sh. 09.08.2024 18:06

Функции delay() нет, но есть sleep(): geeksforgeeks.org/sleep-function-in-c/#

Barmar 09.08.2024 18:07

Попросите пользователя ввести данные, например. «Пожалуйста, нажмите Enter, чтобы продолжить...» или что-то подобное, и используйте char buffer[100]; fgets(buffer, sizeof buffer, stdin);

Some programmer dude 09.08.2024 18:07

В Windows вы можете сделать что-то вроде system("pause") Я думаю.

Eugene Sh. 09.08.2024 18:07

@Someprogrammerdude Или просто getchar();. Не то чтобы пользователь заботился о получении ввода.

Ray 09.08.2024 18:40

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

the busybee 09.08.2024 19:04

Делать задержку программы перед выходом — это совершенно ненормально. Как вам уже говорили другие, исправьте способ запуска, чтобы окно не закрывалось сразу после завершения, не пытайтесь заставить программу отложить завершение. Если вы запустите практически любой встроенный инструмент командной строки, поставляемый с Windows, например dir, вы увидите, что они делают то же самое, что и ваша программа, потому что это нормальное ожидаемое поведение.

Charles Duffy 09.08.2024 19:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
111
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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 09.08.2024 19:11

@isrnick -- да, правда. Спасибо за этот полезный комментарий.

greg spears 09.08.2024 19:55

Если во входном потоке остался символ новой строки (например, в результате использования scanf), то использование getchar не приостановит программу. Оно вернется немедленно. Поэтому я боюсь, что это решение не будет надежно работать во всех ситуациях.

Andreas Wenzel 09.08.2024 19:55

@AndreasWenzel - тоже правда. Все: Обратите внимание: getchar() — это лишь один из многих вариантов, обсуждаемых в моем ответе/решении. getchar() был выделен потому, что он портативен и, как и многие портативные решения, имеет существенные недостатки. Лучшим решением, вероятно, будет другой вариант, который я представил, но тот, который соответствует выбранной платформе.

greg spears 09.08.2024 20:15
Ответ принят как подходящий

Сообщение об ошибке, которое вы видите, говорит о том, что в вашей области функция 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>. Странный. Но это сработало, так что большое спасибо за вашу помощь!

Sinan Mert Uluçay 09.08.2024 20:01

@SinanMertUluçay, это действительно зависит от типа среды, в которой вы находитесь, и типа используемого компилятора. Я сама студентка, всегда рада помочь другим!

Alexxino 09.08.2024 20:26

Как говорит @gregspears, getchar() — это то, что вам нужно, если вы хотите решить эту проблему в своем коде.

Мой совет — настройте свой терминал так, чтобы он не закрывался после завершения программы.

Другие показали вам несколько способов приостановить или добавить задержку в вашу программу.

Однако правильный способ запуска программ командной строки — выполнить их на терминале. Таким образом, ваша программа будет печатать свои выходные данные на терминале, на котором вы ее выполняете, оставаясь на экране терминала даже после того, как программа завершит свое выполнение. Это означает, что в вашу программу не нужно добавлять паузы или задержки.

В случае с Windows вы обычно запускаете его в терминалах командной строки (cmd.exe) или Powershell (powershell.exe). И я считаю, что наиболее практично это сделать: перейти к папке программы в окне проводника, а затем щелкнуть панель навигации по пути в проводнике, ввести cmd и нажать Enter, чтобы открыть терминал командной строки непосредственно в папке. где ваша программа.

Затем вам просто нужно ввести имя исполняемого файла вашей программы в терминале и нажать Enter, чтобы запустить его.

C:\path\to\your\programs\folder>helloworld.exe

Другие вопросы по теме