#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. Я надеялся, что существует «документированная» разница между моим автономным ответом и версией с вашим вкладом в последнем абзаце. Ну что ж, если вы не возражаете….