system(“pause”) для Linux в gcc C

Вопрос или проблема

Какой аналог system(“pause”) в Linux на языке C. Не C++.

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

моя функция

void logout() {
    printf("Вы успешно вышли\n");
    system("pause");
    login();
}

Вы можете использовать getchar для этого:

#include <stdio.h>

void logout() {
    printf("Вы успешно вышли\n");
    int c = getchar();
    login();
}

Если вы не хотите, чтобы пользователь был обязан нажимать ENTER, единственным вариантом будет использование следующих заголовочных файлов:

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

Тогда код будет таким:

struct termios oldt, newt;
char c;

// Сохраните текущие атрибуты терминала
tcgetattr(STDIN_FILENO, &oldt);

// Переключите терминал в сырой режим
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);

// Прочитайте один символ из терминала
c = getchar();
printf("Вы ввели: %c\n", c);

// Восстановите оригинальные атрибуты терминала
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

Поскольку fflush(stdin) и system("pause") не работают в Linux, вам нужно определить две простые функции, чтобы остановить программу на C:

void clean_buffer(){
    char c;
    while ((c = getchar()) != EOF && c != '\n');
} /* Это очистит буфер */

void stop_system(){
    clean_buffer();
    printf("Нажмите Enter, чтобы продолжить...");
    getchar();
} /* Это будет ждать, пока пользователь не нажмет Enter, подобно system("pause") */

Если вы не вызовете clean_buffer() внутри stop_system(), входной буфер все еще может содержать символ ‘\n’ от предыдущей операции. Когда getchar() вызывается, он потребляет ‘\n’ из буфера и сразу же возвращается, что приводит к продолжению программы без ожидания ввода от пользователя. Поэтому важно сначала очистить буфер.

Ответ или решение

Аналог функции system("pause") в Linux для языка C

При переходе с Windows на Linux многие разработчики сталкиваются с тем, что функции, знакомые им из Windows, не существуют в Linux. Одной из таких функций является system("pause"), которая используется для временной паузы в программе до нажатия любой клавиши. В среде Linux необходимо использовать альтернативные подходы для выполнения аналогичной задачи.

Проблема

Вы хотите реализовать функцию выхода из системы, которая выводит сообщение о том, что пользователь успешно вышел, и затем ожидает, чтобы пользователь нажал клавишу перед возвращением к основной функции входа. Рассмотрим несколько способов решения данной задачи в языке C.

Способы реализации аналогичной функциональности

1. Использование getchar()

Этот способ является простейшим и наиболее распространённым при написании программ на C. Он требует от пользователя нажатия клавиши Enter для продолжения.

#include <stdio.h>

void logout() {
    printf("Вы успешно вышли из системы\n");
    getchar(); // ожидает нажатия клавиши Enter
    login(); // возвращаемся к функции входа
}

2. Использование управления терминалом

Если вы хотите, чтобы программа ожидала ввода без необходимости нажимать Enter, можно использовать функциональность для управления терминалом. Для этого необходимо включить режим "сыроого ввода", что позволяет читать символы по одному.

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

void enableRawMode(struct termios *oldt) {
    struct termios newt;

    // Сохраняем текущие настройки терминала
    tcgetattr(STDIN_FILENO, oldt);

    // Переходим в сырой режим
    newt = *oldt;
    newt.c_lflag &= ~(ICANON | ECHO); // отключаем канонический режим и эхо
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
}

void disableRawMode(struct termios *oldt) {
    // Восстанавливаем старые настройки терминала
    tcsetattr(STDIN_FILENO, TCSANOW, oldt);
}

void logout() {
    struct termios oldt;
    char c;

    printf("Вы успешно вышли из системы\n");
    enableRawMode(&oldt); // активируем сырой режим

    c = getchar(); // читаем один символ

    disableRawMode(&oldt); // восстанавливаем стандартный режим
    login(); // возвращаемся к функции входа
}

3. Вариант с очисткой буфера ввода

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

#include <stdio.h>

void clean_buffer() {
    char c;
    while ((c = getchar()) != EOF && c != '\n') ; // очищаем буфер ввода
}

void stop_system() {
    clean_buffer(); // очищаем буфер
    printf("Нажмите Enter для продолжения...");
    getchar(); // ждём нажатия Enter
}

void logout() {
    printf("Вы успешно вышли из системы\n");
    stop_system(); // ожидание ввода от пользователя
    login(); // возвращаемся к функции входа
}

Заключение

Выбор подхода для ожидания ввода от пользователя зависит от ваших требований к удобству и функциональности программы. Использование getchar() является простым и эффективным вариантом, тогда как управление терминалом предоставляет больше контроля, но требует немного больше усилий для реализации. Также в заключение стоит отметить важность очистки буфера ввода, что предотвращает возможные проблемы с некорректным вводом.

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

Оцените материал
Добавить комментарий

Капча загружается...