#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