Загрузка данных


#include <stdio.h>

void encode() {
    char c, sep;
    int is_first = 1;

    while (1) {
        // Считываем символ
        if (scanf("%c", &c) != 1) {
            printf("n/a\n");
            return;
        }
        // Если сразу пришел перенос строки
        if (c == '\n') {
            if (is_first) printf("\n");
            break;
        }

        // Считываем разделитель (сразу за символом)
        int sep_res = scanf("%c", &sep);
        if (sep_res != 1) {
            sep = '\n'; // Если конец файла, считаем это концом строки
        }

        // Если после символа идет не пробел и не перенос строки — ошибка формата
        if (sep != ' ' && sep != '\n') {
            printf("n/a\n");
            return;
        }

        // Если валидация пройдена, печатаем
        if (!is_first) printf(" ");
        printf("%02X", c);
        is_first = 0;

        // Если это был перенос строки, завершаем
        if (sep == '\n') {
            printf("\n");
            break;
        }
    }
}

void decode() {
    char c1, c2, sep;
    int is_first = 1;

    while (1) {
        // Считываем первый символ HEX
        if (scanf("%c", &c1) != 1) {
            printf("n/a\n");
            return;
        }
        if (c1 == '\n') {
            if (is_first) printf("\n");
            break;
        }

        // Считываем второй символ HEX
        if (scanf("%c", &c2) != 1) {
            printf("n/a\n");
            return;
        }
        // HEX должен состоять ровно из двух символов
        if (c2 == ' ' || c2 == '\n') {
            printf("n/a\n");
            return;
        }

        // Считываем разделитель
        int sep_res = scanf("%c", &sep);
        if (sep_res != 1) {
            sep = '\n';
        }

        // Разделитель обязан быть пробелом или переносом
        if (sep != ' ' && sep != '\n') {
            printf("n/a\n");
            return;
        }

        // Переводим HEX в числа
        int v1 = -1, v2 = -1;

        if (c1 >= '0' && c1 <= '9') v1 = c1 - '0';
        else if (c1 >= 'a' && c1 <= 'f') v1 = c1 - 'a' + 10;
        else if (c1 >= 'A' && c1 <= 'F') v1 = c1 - 'A' + 10;

        if (c2 >= '0' && c2 <= '9') v2 = c2 - '0';
        else if (c2 >= 'a' && c2 <= 'f') v2 = c2 - 'a' + 10;
        else if (c2 >= 'A' && c2 <= 'F') v2 = c2 - 'A' + 10;

        if (v1 == -1 || v2 == -1) {
            printf("n/a\n");
            return;
        }

        // Печатаем раскодированный символ
        if (!is_first) printf(" ");
        printf("%c", v1 * 16 + v2);
        is_first = 0;

        // Если достигли конца ввода
        if (sep == '\n') {
            printf("\n");
            break;
        }
    }
}

int main(int argc, char *argv[]) {
    // Проверка количества аргументов
    if (argc != 2) {
        printf("n/a\n");
        return 1;
    }

    // Проверка режима без использования <string.h>
    char *arg = argv[1];
    if (arg[0] == '0' && arg[1] == '\0') {
        encode();
    } else if (arg[0] == '1' && arg[1] == '\0') {
        decode();
    } else {
        printf("n/a\n");
    }

    return 0;
}