Преобразование строки в число и обратно

Задачи и их решение / Преобразование строки в число и обратно

Задача Преобразовать строку символов в соответствующее число и обратно

При составлении программ часто возникает задача получения данных, например, введенных в поле редактирования в числовой форме и вывод результата в текстовое поле.
Число, которое принимает участие в вычислительных процедурах, должно быть представлено в виде строки символов, понятных пользователю, для вывода на экран.
Например, число 235 состоит из трех символов - '2', '3', '5'. Целью данной статьи является приведение символьной строки к соответствующему ей числовому виду.
Для этого нужно разбить символьную строку на значащие разряды и выбрать цифры, соответствующие каждому значащему разряду.

Каждый символ цифры имеет соответствующий ему код в базовой таблице кодировки:

Символ цифры Десятичный код Шестнадцатеричный код Двоичный код
0 48 0x30 0011 0000
1 49 0x31 0011 0001
2 50 0x32 0011 0010
3 51 0x33 0011 0011
4 52 0x34 0011 0100
5 53 0x35 0011 0101
6 54 0x36 0011 0110
7 55 0x37 0011 0111
8 56 0x38 0011 1000
9 57 0x39 0011 1001

В соответствии с приведенной таблицей, значащая часть каждого символа цифры содержится в младшей тетраде битов (младших четырех разрядах). Для получения цифры, соответствующей символу, достаточно произвести операцию:

n = s & 0x0F;

где n - значащая цифра, s - символ цифры. Маска 0x0F позволяет оставить только младшие 4 значащих разряда. Старшие 4 разряда становятся равны 0.

При решении обратной задачи - представления числа в виде текстовой строки - каждая цифра значащего разряда преобразуется в соответствующий ей символ с помощью операции:

s = n | 0x30;

Указанная операция добавляет двоичное значение 0011 в старшие 4 разряда, тем самым формируя код символа из соответствующей значащей цифры.

Реализация

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
// Функция преобразования строки в число
int StrToInt(char *s) {
  int temp= 0; // число
  int i = 0;
  int sign = 0; // знак числа 0- положительное, 1 - отрицательное
  if(s[i]=='-') {
    sign = 1;
    i++;
  }
  while(s[i]>=0x30 && s[i]<=0x39) {
    temp = temp + (s[i] & 0x0F);
    temp = temp * 10;
    i++;
  }
  temp = temp / 10;
  if(sign==1)
    temp = -temp;
  return(temp);
}
// Функция преобразования числа в строку
char* IntToStr(int n) {
  char s[40], t, *temp;
  int i, k;
  int sign = 0;
  i = 0;
  k = n;
  if(k<0) {
    sign = 1;
    k = -k;
  }
  do {
    t = k%10;
    k = k/10;
    s[i] = t | 0x30;
    i++;
  } while(k>0);
  if(sign==1) {
    s[i]='-';
    i++;
  }
  temp = (char*)malloc(i);
  k = 0;
  i--;
  while(i>=0) {
    temp[k] = s[i];
    i--; k++;
  }
  temp[k] = '\0';
  return(temp);
}
// Проверка выполнения
int main() {
  int num;
  char s[40], *n;
  system("chcp 1251");
  system("cls");
  printf("Введите число: ");
  gets(s);
  num = StrToInt(s);
  printf("Вы ввели число %d",num);
  num = num + 1;
  n = IntToStr(num);
  printf("\n увеличенное на 1 число равно ");
  puts(n);
  getchar();
  return 0;
}

Результат выполнения
Преобразование числа в строку
Назад

Комментариев к записи: 5

  • А после выделения памяти при помощи malloc не нужно освобождать ее используя free?


    • Да, использование malloc() предполагает освобождение памяти с помощью функции free(). В случае отсутствия вызова функции free() освобождение памяти происходит автоматически при завершении программы.


  • Никто не заметил, что число 0 неверно преобразовывалось в строку. Сейчас исправила.



Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *