Пожалуйста, объясните, что делает этот код (someChar - 48) - PullRequest
7 голосов
/ 07 июля 2010

У меня возникают некоторые практические проблемы, и я видел этот код:

#include <stdio.h>
#include <string.h>

int main(void) {
   char* s = "357";
   int sum = 0;
   int i = 0;
   for (i = 0; i < strlen(s); i++) {
     sum += s[i] - 48;
   }
   printf("Sum is %d", sum);

   return 0;
}

Может кто-нибудь объяснить, что делает код, особенно вычитание с 48 частями?

Ответы [ 4 ]

32 голосов
/ 07 июля 2010

Код в основном суммирует цифры числа, представленные в виде строки. Это делает два важных предположения для правильной работы:

  • Строка содержит только символы в диапазоне '0'..'9'
  • Используется кодировка символов ASCII

В ASCII '0' == 48, '1' == 49 и т. Д. Таким образом, '0' - 48 == 0, '1' - 48 == 1 и т. Д. То есть вычитание на 48 переводит char значения '0'..'9' в int значения 0..9.

Таким образом, именно потому, что '0' == 48, код также будет работать с:

sum += s[i] - '0';

Намерение, возможно, немного более ясно в этой версии.

Конечно, вы можете сделать «обратное» отображение путем добавления, например, 5 + '0' == '5'. Точно так же, если у вас есть char, содержащее букву в диапазоне 'A'..'Z', вы можете «вычесть» из нее 'A', чтобы получить индекс этой буквы в диапазоне 0..25.

Смотри также

Похожие вопросы


Об альтернативных кодировках

Как уже упоминалось, исходный код - 48 предполагает, что используется кодировка символов ASCII. - '0' не только улучшает удобочитаемость, но и отменяет допущение ASCII и будет работать с любым кодированием , как указано языком C, который предусматривает, что цифровые символы должны кодироваться последовательно в непрерывном блоке.

С другой стороны, в отношении писем такого положения не предусмотрено. Таким образом, в редкой ситуации, когда вы используете, например, кодировку EBCDIC, отображение 'A'..'Z' в 0..25 уже не так просто, как вычитание 'A', из-за того, что буквы NOT кодируется последовательно в непрерывном блоке в EBCDIC.

Некоторые языки программирования упрощают работу, поскольку для представления исходного кода используется одна конкретная кодировка (например, Java использует Unicode: JLS §3.1 )

Смотри также

Смежные вопросы

5 голосов
/ 07 июля 2010

Поиск суммы чисел в строке s.

sum += s[i] - 48; преобразует символы ASCII в их числовые значения.

2 голосов
/ 07 июля 2010

складывается 3 + 5 + 7, а затем печатается

Сумма 15

Часть -48 состоит в том, что она вычитает символ 0, то есть значение ascii для 0.

Так, что он делает, это

'3' - '0' > 51 - 48
'5' - '0' > 53 - 48
'7' - '0' > 55 - 48

Как видите, в C '0' (ноль символа) отличается от 0 (число 0). Они имеют разные значения (среди прочего)

1 голос
/ 07 июля 2010

Я предлагаю написать тестовую программу, чтобы увидеть, что показывают значения s []. Вы также можете распечатать все значения для каждой записи в "0123456789".

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

Веселись!

...