#arrays #c #char #integer
Вопрос:
Поэтому мне было поручено хранить два 50-значных целых числа на языке си и составлять с их помощью математические уравнения. проблема для меня заключалась в том, чтобы хранить входные данные цифра за цифрой в массиве. Я решил, что могу хранить входные данные в строке символов, подобной этой:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
char string_test [50];
scanf("%s", string_test);
return 0;
}
Но я не мог использовать его как число, потому что оно хранилось как символ, и я не мог скопировать их цифру за цифрой в другой массив, который был определен как int
после целого дня поисков я обнаружил, что мне нужно скопировать свою строку одну за другой, как это:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
char string_test [50];
scanf("%s", string_test);
int arr[50];
for (int i = 0; i < 50; i )
{
arr[i] = string_test[i] - '0';
}
return 0;
}
Теперь мой вопрос в том, почему мне нужно вычесть «0», чтобы получить подходящий результат?
Комментарии:
1. В стороне:
char string_test [50];
1 слишком мал для хранения 50-значной строки . Используйтеchar string_test [50 1]; scanf("Ps", string_test);
или что-то в этом роде.2. Вы можете посмотреть разницу между числовым значением
5
и представлением ASCII для символа'5'
. Последнее имеет числовое значение0x35
или53
довольно бесполезно для выполнения математических вычислений3. Ответ на ваши вопросы и объяснение ваших проблем можно найти в главе под названием «строки» вашей обычной книги по программированию на языке Си. На изучение должно уйти гораздо меньше времени, чем на целый день поисков.
4. Цифровые символы
'0'
'9'
гарантированно будут иметь последовательные коды символов, поэтому вычитание кода'0'
символа из любого цифрового символа преобразует его в соответствующее цифровое значение.
Ответ №1:
Значения ASCII для цифр 0 — 9 являются:
Digit 0 1 2 3 4 5 6 7 8 9
ASCII value 48 49 50 51 52 53 54 55 56 57
Поэтому, если у вас есть строковое представление целого числа, скажем
char int_str[] = "123456";
и нужно преобразовать каждое char
из них в его числовое значение, вычитание значения для '0'
(48) из каждого приведет к значениям
int_str[0] == '1' ==> '1' - '0' ==> 42 - 41 == 1
int_str[1] == '2' ==> '2' - '0' ==> 43 - 41 == 2
int_str[2] == '3' ==> '3' - '0' ==> 44 - 41 == 3
int_str[3] == '4' ==> '4' - '0' ==> 45 - 41 == 4
int_str[4] == '5' ==> '5' - '0' ==> 46 - 41 == 5
int_str[5] == '6' ==> '6' - '0' ==> 47 - 41 == 6
Для преобразования цифр 1
2
3
4
5
6
в целое 123456
число требуются дополнительные шаги:
В этом примере используются те же преобразования, инкапсулированные в функцию, для преобразования дискретных char
цифр в int
цифровые значения, а затем для преобразования каждого дискретного значения int в составное целое значение:
int main(void)
{
char str[] = "123456";
int int_num = str2int(str);
return 0;
}
int str2int(char *str)
{
int sum=0;
while(*str != '')
{ //qualify string
if(*str < '0' || *str > '9')
{
printf("Unable to convert it into integer.n");
return 0;
}
else
{ //assimilate digits into integer
sum = sum*10 (*str - '0');
str ;
}
}
return sum;
}
Ответ №2:
Символ, подобный '0'
символу, — это просто ASCII-представление 1-байтового числа. Числовые представления этих символов можно найти в руководстве ( man ascii
). Здесь вы увидите, что '0'
на самом деле представляет число 48
или 0x30
и что ASCII '0'
'9'
являются последовательными.
Чтобы преобразовать числовое значение символа в его целочисленный аналог, необходимо вычесть это значение 48
или '0'
.
Я надеюсь, что это все прояснит. Для получения дополнительной информации ознакомьтесь с арифметикой символов в C.
Ответ №3:
На самом деле это связано с представлением чисел в коде ASCII; когда вы вводите символ «0», он сохраняется в памяти в виде значения 48 (в десятичном формате), а также любого другого числа или символа.
Вы обнаружите, что значение кода ASCII для » 1 » равно 49, поэтому , если мы применяем операцию int x = '1' - '0';
, мы сохраняем десятичное значение 1 в x и обрабатываем его как число, а не как символ.
Вы можете найти больше о кодах ASCII; это очень полезная тема для любого программиста.