Преобразование строки в число и обратно
При составлении программ часто возникает задача получения данных, например, введенных в поле редактирования в числовой форме и вывод результата в текстовое поле.
Число, которое принимает участие в вычислительных процедурах, должно быть представлено в виде строки символов, понятных пользователю, для вывода на экран.
Например, число 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 разряда, тем самым формируя код символа из соответствующей значащей цифры.
Реализация на C++
#include
using namespace std;
// Функция преобразования строки в число
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] 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 = new char [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» );
cout cin.getline(s, 80);
num = StrToInt(s);
cout num = num + 1;
n = IntToStr(num);
cout cin.get();
return 0;
>
Результат выполнения
Комментариев к записи: 15
Как конвертировать символ в цифру?
Есть переменная типа string , в неё записывается строка, введённая пользователем с клавиатуры. Нужно посчитать сумму всех цифр в этой строке. Проблема в том, что не удаётся перевести символьную цифру в цифровую цифру. Пробовал юзать функцию atoi , но она выдаёт неправильный результат. Мой код:
string s; //code code. cin>>s; //code code. for(int i=0;i47 && (int)s[i] <58) < count++; sum+=atoi(&s[i]); >>
Как в Си перевести символ в число.
В общем обычные числы, от 0 до 9, но записаны они как символы, как их перевести в числа? Обратную операцию знаю, а как так сделать хз. При обычном переводе, т е пусть с=’1′, а а-числовая переменная. Если просто сделать а=с, то он выдает мол а как число равно 49(ну или как то так, в общем не 1). Как преобразовать символ в число?
16 Oct 2015 в 09:34 #2
Отнять потом 48
16 Oct 2015 в 09:36 #3
16 Oct 2015 в 09:37 #4
Bloodnaix сказал(а):↑
Отнять потом 48
Нажмите, чтобы раскрыть.
Лучше все-таки ‘0’, не учи его извращениям)
16 Oct 2015 в 09:47 #5
Поняха сказал(а):↑
В общем обычные числы, от 0 до 9, но записаны они как символы, как их перевести в числа? Обратную операцию знаю, а как так сделать хз. При обычном переводе, т е пусть с=’1′, а а-числовая переменная. Если просто сделать а=с, то он выдает мол а как число равно 49(ну или как то так, в общем не 1). Как преобразовать символ в число?
Нажмите, чтобы раскрыть.
1=49, 2=50 по таблице символов ASCII, я не сильный спец, но думаю что-то типо этого
Как перевести символ в число си
Нередко в программах встречается ситуация, когда надо преобразовать число в строку или строку в число. Для этой цели в стандартной библиотеке языка С определены функции strtol() и snprintf() .
Из строки в число. strtol
Функция strtol() преобразует строку в число типа long int . Функция определена в заголовочном файле stdlib.h и имеет следующий прототип:
long strtol(const char *restrict str, char **restrict str_end, int base);
- str — строка с числом, которое надо преобразовать в числовой тип. Ключевое слово restrict указывает компилятору оптимизировать код и что никакой другой параметр не будет указывать на адрес данного параметра.
- str_end — указатель на последний символ строки. Данный параметр можно игнорировать, передавая ему значение NULL
- base — основание, система исчисления, в которую надо преобразовать данные (значение от 2 до 36).
Результатом функции является преобразованное число типа long .
Например, преобразуем строку в число в десятичной системе:
#include #include int main(void) < const char * str = "24 flowers"; long result = strtol(str, NULL, 10); printf("Result: %ld\n", result); // Result: 24 return 0; >
В примере выше второй параметр функции никак не использовался — мы ему передавали значение NULL , и функция нормально работала. Однако он может быть полезен, если нам надо получить остаток строки, которая идет после числа:
#include #include int main(void) < const char * str = "24 flowers"; char* str_end; long result = strtol(str, &str_end, 10); printf("Result: %ld\n", result); // Result: 24 printf("Rest of the string:%s\n", str_end); // Rest of the string: flowers return 0; >
Из числа в строку. snprintf
Функция snprintf() преобразует число в отформатированную строку. Функция определена в заголовочном файле stdio.h и имеет следующий прототип:
int snprintf(char *restrict str_buffer, size_t buffer_size, const char *restrict format, . );
- str_buffer — строка, в которую помещается преобразованное число.
- buffer_size — максимальное количество символов строки. Функция записывает в строку buffer-size — 1 байт и добавляет концевой нулевой байт
- format — задает формат преобразования в строку.
При успешном преобразовании функция возвращает количество символов, записанных в строку (исключая концевой нулевой байт). При неудачном преобразовании возвращается отрицательное число.
#include int main(void) < int number = 354; char str [10]; snprintf(str, sizeof str, "%d", number); printf("Result: %s\n", str); // Result: 354 return 0; >
При этом строка форматирования может содержать множество параметров:
#include int main(void) < int count = 3; double price = 79.99; char str [50]; snprintf(str, sizeof str, "Count: %d \tPrice: %.2f", count, price); printf("%s\n", str); // Count: 3 Price: 79.99 return 0; >