Обработать параметры запуска программы - 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;
}