Почему я должен вычесть «0», чтобы я мог сделать int_arr[5] = char_string[5]?

#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; это очень полезная тема для любого программиста.