IsCharAlphaNumeric &&! IsCharAlpha == IsCharNumeric? - PullRequest
4 голосов
/ 18 января 2012

На этой странице поддержки Microsoft показано, что не существует Win32, эквивалентного C 100 * *.

среды выполнения C, но есть IsCharAlphaNumeric и IsCharAlpha.

Интуитивно, это приводит меня к: IsCharAlphaNumeric() && !IsCharAlpha() эквивалентно (несуществующему) IsCharNumeric()

Но я могу что-то упустить ...

Могу ли я с уверенностью предположить, что вышеприведенное верно?

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Не зная семантики IsCharAlphaNumeric() и IsCharAlpha(), невозможно определить, выполняется ли

IsCharNumeric(c) == (IsCharAlphaNumeric(c) && !IsCharAlpha(c))

для всех c.И может быть разумно, чтобы он не содержал, например, шестнадцатеричные цифры могут быть как числовыми, так и буквенными.

Другими словами, вы не можете безопасно предполагать эквивалентность.

0 голосов
/ 23 апреля 2013

Использование:

function IsCharNumeric(ch: Char): Boolean;
begin
   //We have IsCharAlphaNumeric, and IsCharAlpha
   //So IsCharNumeric = IsCharAlphaNumber - IsCharAlpha
   Result := IsCharAlphaNumeric(ch) and (not IsCharAlpha(ch));
end;

Вот результаты теста для выбранных символов.

Примечание : пропущен любой символ "not" числовой:

Кодовый символ IsCharNumeric

  • 32 "(space)": Нет
  • 33 "!": Нет
  • 34 "" ": Нет
  • 35" # ": Нет
  • 36" $ ": Нет
  • 40" ( ": Нет
  • 41 ")": Нет
  • 43 "+": Нет
  • 44 ",": Нет
  • 45 "- ": Нет
  • 46" . ": Нет
  • 48" 0 ": Да
  • 49" 1 ": Да
  • 50 "2": Да
  • 51 "3": Да
  • 52 "4": Да
  • 53 "5": Да
  • 54 "6": Да
  • 55 "7": Да
  • 56 "8": Да
  • 57 "9": Да
  • 65 "A": Нет
  • 66 "B": Нет
  • 67 "C": Нет
  • 68 "D": Нет
  • 69 "E": Нет
  • 70 "F": Нет
  • 178 "²": Да
  • 179 "³": Да
  • 185 "¹ ": Да

Таким образом, если вы хотите урезать строку до тех символов, которые могут быть проанализированы в число, вы потеряете:

  • -1234.56

Но усиление

  • ¹²³4.56

С другой стороны, некоторые символы терпят неудачу IsCharAlphaNumericтест, когда вы думаете, что они пройдут:

 !"#$%&'()*+,-./

Первый символ ASCII, переживший тест IsCharAlphaNumeric, фактически равен нулю (0).

0 голосов
/ 18 января 2012

Ваш код не имеет смысла для меня.

Просто используйте isdigit(), это предписано стандартами C, достаточно старыми для реализации Microsoft.

Лучший способ перестроить его, если это действительно необходимо, это:

int isdigit(int character)
{
  return character >= '0' && character <= '9';
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...