Задача на алгоритмы. Работа со строками - C (СИ)
Формулировка задачи:
Всем доброго времени суток!
Передо мной стоит достаточно нетривиальная задача. Кому интересно прошу помочь.
Задача:
На входе: у нас строка, которая содержит пробелы (работать нужно не со string, а только с char), также эта строка содержит числа в десятичной системе исчисления.
На выходе: точно эта же строка, только в ней все числа десятичной системы исчисления заменены на эти же числа только представленные в шестнадцатеричной системы исчисления.
Условия: нельзя пользоваться никакими стандартными функциями и библиотеками. Все так сказать "в ручную".
Я собственно говоря написал код, который находит в строке все числа десятичной системы исчисления, формирует новую строку из этих чисел в шестнадцатеричной системе исчисления. Но эта строка без пробелов и содержит только числа.
Как работает мой код:
На входе: 44ssf44fffff4ddd4; На выходе: Ox6C81C
А как должно быть:
На входе: aaaa 444444ffffff dddd; На выходе: aaaa Ox6C81Cffffff dddd;
Моя реализация:
Буду очень благодарен за помощь!
#include <stdio.h> void inputChar(char *str) { printf("input array char <100: "); scanf("%s", str); } void revers(char *A) { int j; for (j = 0; A[j] != '\0'; j++); j--; for (int i = 0; i <j; i++, j--) { char temp = A[i]; A[i] = A[j]; A[j] = temp; } } int charToDecInt(char *A) { int summ = 0; for (int i = 0; A[i] != '\0'; i++) { if (A[i] >= '0' && A[i] <= '9') { summ *= 10; summ += A[i] - '0'; } } return summ; } void decIntTohexString(int a, char *A) { int j = 0; while (a != 0) { int r = a % 16; if (r > 9) { r += 'A' - 10; } else { r += '0'; } A[j++] = r; a /= 16; } A[j] = '\0'; revers(A); } void display() { const int N = 100; char A[N] = ""; char B[N] = ""; inputChar(A); int a = charToDecInt(A); decIntTohexString(a, B); printf("hexChar = Ox%s\n", B); } int main() { display(); return 0; }
Решение задачи: «Задача на алгоритмы. Работа со строками»
textual
Листинг программы
#include <stdio.h> #include <locale.h> int strLen(char *S) { int n; for (n = 0; S[n] != '\0'; n++); return n; } void revers(char *A) { int j; for (j = 0; A[j] != '\0'; j++); j--; for (int i = 0; i <j; i++, j--) { char temp = A[i]; A[i] = A[j]; A[j] = temp; } } void digitDecToHexString(int digit, char *T) { int j = 0; while (digit != 0) { int r = digit % 16; if (r >= 1 && r <= 9) { r += '0'; } else { r += 'A' - 10; } T[j++] = r; digit /= 16; } T[j] = '\0'; revers(T); } void intDecToCharHex(char *A, char *B) { int n = strLen(A); char Hex[1000] = ""; int i = 0; int j = 0; int k = 0; int v = 0; int p = 0; for(i = 0; i<n; i++) { if ('0' <= A[i] && A[i] <= '9') { v = v * 10 + (A[i] - '0'); k = 1; } else { if (k == 1) { digitDecToHexString(v, Hex); B[j++] = '0'; B[j++] = 'x'; for (p = 0; p < strLen(Hex); p++) { B[j++] = Hex[p]; } } B[j++] = A[i]; k = 0; v = 0; } } if (k == 1) { digitDecToHexString(v, Hex); B[j++] = '0'; B[j++] = 'x'; for (p = 0; p < strLen(Hex); p++) { B[j++] = Hex[p]; } } } void inputCharArray(char *S) { printf("Введите строку на латинском алфавите размерностью мене 1000 символов: \n"); scanf("%[^\n]s", S); } void display() { char A[1000] = { '\0' }; inputCharArray(A); char B[1000] = ""; intDecToCharHex(A, B); printf("Входная строка: \n%s\n", A); printf("Строка после обработки: \n%s\n", B); } int main() { setlocale(LC_ALL, "Rus"); display(); return 0; }
Объяснение кода листинга программы
- В функции
strLen
инициализируется переменнаяn
равной 0. - В функции
revers
инициализируется переменнаяj
равной 0. - В функции
digitDecToHexString
используется переменнаяr
для хранения остатка от деления числа на 16. - В функции
intDecToCharHex
инициализируется переменнаяn
равной 0. - В функции
intDecToCharHex
инициализируется массивHex
размером 1000 символов со значением пустой строки ````. - В функции
intDecToCharHex
инициализируется переменнаяk
равной 0. - В функции
intDecToCharHex
инициализируется переменнаяv
равной 0. - В функции
intDecToCharHex
инициализируется переменнаяp
равной 0. - В функции
inputCharArray
выводится запрос на ввод строки. - В функции
display
создается пустой массивA
размером 1000 символов. - В функции
display
вызывается функцияinputCharArray
для ввода строки в массивA
. - В функции
display
создается пустой массивB
размером 1000 символов. - В функции
display
вызывается функцияintDecToCharHex
для преобразования строки из массиваA
в массивB
. - В функции
display
выводится на экран входная строка из массиваA
. - В функции
display
выводится на экран обработанная строка из массиваB
. - В функции
main
устанавливается локальная настройка на русский язык с помощьюsetlocale
. - В функции
main
вызывается функцияdisplay
. - В функции
main
возвращается 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д