Обработать параметры запуска программы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем доброго дня, прошу помочь в выполнении такой задачи Написать программу, которая обеспечивает работу команды вида: [имья_команды] [-a | -b] [-o выходной файл], где -a и -b несовместимые флаги. • если задан флаг -a - команда отображает имя почтового ящика; • если задан флаг -b - имя текущего каталога. Полученная информация также записывается в файл, имя которого задается как аргумент опции -o. Вообще с си никак( Заранее благодарен!

Решение задачи: «Обработать параметры запуска программы»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <linux/limits.h>
 
enum EFlags {
    NONE = 0x00,
    PRINT_EMAIL = 0x01,
    PRINT_PATH = 0x02,
    TO_FILE = 0x04
};
 
typedef struct TParams_t {
    int flags;
    const char* file;
}   TParams;
 
TParams getParams(int argc, char* argv[]) {
    TParams params = {NONE, NULL};
    int i;
 
    for (i = 0; i < argc; ++i) {
        if (strcmp(argv[i], "-a") == 0) {
            params.flags |= PRINT_EMAIL;
        }
        else if (strcmp(argv[i], "-b") == 0) {
            params.flags |= PRINT_PATH;
        }
        else if (strcmp(argv[i], "-o") == 0) {
            params.flags |= TO_FILE;
            if (i < argc - 1) {
                params.file = argv[++i];
            }
        }
    }
 
    return params;
}
 
bool checkParams(TParams params) {
    if ((params.flags & PRINT_PATH) && (params.flags & PRINT_EMAIL)) {
        return false;
    }
 
    if ((params.flags & TO_FILE) && (params.file == NULL)) {
        return false;
    }
 
    return true;
}
 
void print(const char text[], FILE* f) {
    fprintf(stdout, "%s\n", text);
    if (f) {
        fprintf(f, "%s\n", text);
    }
}
 
void operations(TParams params) {
    FILE* f = NULL;
    if (params.flags & TO_FILE) {
        f = fopen(params.file, "w");
    }
    if (params.flags & PRINT_PATH) {
        char path[PATH_MAX];
        getcwd(path, PATH_MAX);
        print(path, f);
    }
    if (params.flags & PRINT_EMAIL) {
        print("my@mail.ru", f);
    }
}
 
int main(int argc, char* argv[]) {
    TParams params = getParams(argc - 1, argv + 1);
 
    if (checkParams(params) == false) {
        fprintf(stderr, "bad params\n");
        return 1;
    }
 
    if (params.flags == NONE) {
        printf("no params\n");
    }
    else {
        operations(params);
    }
 
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5