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


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Функция кодирования символа в HEX
void encode_char(char c, char* hex) {
    sprintf(hex, "%X", (unsigned char)c);
    // Если HEX однозначный, добавляем 0 в начале
    if (strlen(hex) == 1) {
        char temp[3];
        temp[0] = '0';
        temp[1] = hex[0];
        temp[2] = '\0';
        strcpy(hex, temp);
    }
}

// Функция декодирования HEX в символ
char decode_char(const char* hex) {
    int value;
    sscanf(hex, "%X", &value);
    return (char)value;
}

int main(int argc, char* argv[]) {
    // Проверяем аргументы командной строки
    if (argc != 2) {
        printf("n/a\n");
        return 1;
    }
    
    int mode = atoi(argv[1]);
    if (mode != 0 && mode != 1) {
        printf("n/a\n");
        return 1;
    }
    
    char input[1000];
    
    // Читаем строку
    if (!fgets(input, sizeof(input), stdin)) {
        printf("n/a\n");
        return 1;
    }
    
    // Удаляем символ перевода строки
    input[strcspn(input, "\n")] = '\0';
    
    if (mode == 0) {
        // РЕЖИМ КОДИРОВАНИЯ
        int first = 1;
        for (int i = 0; input[i] != '\0'; i++) {
            if (input[i] == ' ') continue;  // Пропускаем пробелы
            
            char hex[3];
            encode_char(input[i], hex);
            
            if (!first) {
                printf(" ");
            }
            printf("%s", hex);
            first = 0;
        }
        printf("\n");
        
    } else if (mode == 1) {
        // РЕЖИМ ДЕКОДИРОВАНИЯ
        char* token = strtok(input, " ");
        int first = 1;
        
        while (token != NULL) {
            // Проверяем, что токен состоит из 2 HEX символов
            if (strlen(token) != 2) {
                printf("n/a\n");
                return 1;
            }
            
            // Проверяем, что это HEX
            int valid = 1;
            for (int i = 0; token[i] != '\0'; i++) {
                if (!((token[i] >= '0' && token[i] <= '9') ||
                      (token[i] >= 'A' && token[i] <= 'F') ||
                      (token[i] >= 'a' && token[i] <= 'f'))) {
                    valid = 0;
                    break;
                }
            }
            
            if (!valid) {
                printf("n/a\n");
                return 1;
            }
            
            char decoded = decode_char(token);
            
            if (!first) {
                printf(" ");
            }
            printf("%c", decoded);
            first = 0;
            token = strtok(NULL, " ");
        }
        printf("\n");
    }
    
    return 0;
}

cd ~/D03T03

# Компилируем
gcc -Wall -Werror -Wextra src/char_decode.c -o char_decode

# Тестируем кодирование
echo "WORLD" | ./char_decode 0
# Должно вывести: 57 4F 52 4C 44

# Тестируем декодирование
echo "48 45 4C 4C 4F" | ./char_decode 1
# Должно вывести: H E L L O

# Проверка на ошибки
echo "WORLD" | ./char_decode 2
# Должно вывести: n/a

# Добавляем файл
git add src/char_decode.c

# Делаем коммит
git commit -m "Quest 2: Character encode/decode using ASCII table

- Support two modes: encode (0) and decode (1)
- Encode: character to 2-digit HEX
- Decode: 2-digit HEX to character
- Separate functions for encode and decode
- Input validation for HEX format"

# Отправляем
git push origin develop