Задача на алгоритмы. Работа со строками - 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, что означает успешное выполнение программы.