невозможно выполнить арифметическую операцию над целым числом из массива символов

#c #char

#c #символ

Вопрос:

Вот тестовая программа, которую я сделал.

 #include <stdio.h>

int main(){
    char arr[10];
    int res=0, p = 2;
    scanf(" %c",amp;arr[1]);
    
    if(arr[1]>=48 amp;amp;arr[1]<=57){
        res = arr[1] * p;
    }

    res = res 10;
    printf("%d",res);
}
 

Для ввода 2
поступает вывод 110 ,
что произойдет, если res = arr[1] * p вместо 2*2 этого оно будет выполняться 50*2 (значение ASCII 2).

Как это исправить и почему это происходит?

Комментарии:

1. Вычесть 48 из arr[1] . Или лучше вычесть '0' (обратите внимание на кавычки).

2. @EugeneSh. Я включил ваши комментарии в свой ответ. Дайте мне знать, если вы не возражаете, пожалуйста. Например. если вы делаете ответ.

3. @user3121023 Хорошая мысль. Это позволило бы корректно вводить данные типа «255». Я рекомендую превратить это в ответ. Но, возможно, спросите, действительно ли OP хочет, чтобы многозначные числа обрабатывались как числа. Мне кажется, я не совсем понимаю.

4. @Yunnosch Никаких проблем вообще

5. @user3121023 Действительно, вы, очевидно, можете дать интересный ответ. Продолжайте.

Ответ №1:

Если вы считываете символ '2' в массив, что вы делаете с "%c" помощью (или " %c" ), то поступающее туда значение будет ASCII-кодом «2», а не значением 2.

ASCII для «2» намного выше, чем 2.

Как упоминает Юджин в комментарии, метод адаптации к смещению заключается в вычитании разницы между ASCII и «цифрой-значением», наиболее эффективно и самоочевидно путем вычитания символа (а не значения) '0' .

Комментарии:

1. Странно, это второй ответ на сегодняшний день, который я отредактировал, чтобы включить вклад — без видимого редактирования в истории…. Это называется «льготный период», не так ли?

2. Я думаю, что если вы сделаете редактирование достаточно быстрым, оно не появится

3. Я надеялся, что существует «документированная» разница между моим автономным ответом и версией с вашим вкладом в последнем абзаце. Ну что ж, если вы не возражаете….