Проверьте, является ли вход в массив TCHAR целым числом со знаком C ++ - PullRequest
0 голосов
/ 30 октября 2018

У меня есть массив TCHAR следующим образом,

TCHAR input[MAX_PATH] = L"12345";

Я хочу проверить, является ли input TCHAR массив действительным целым числом со знаком или нет? Вот некоторые примеры для этого, и результат должен быть следующим,

  • L "123-" -> false
  • L "123" -> true
  • L "abc" -> false
  • L "-123" -> true

1 Ответ

0 голосов
/ 30 октября 2018

Одной из очевидных возможностей будет использование регулярного выражения с шаблоном, например, -?[0-9]+.

Это гарантирует, что input содержит только необязательный знак, за которым следует некоторое количество цифр, - но не гарантирует, что количество цифр будет соответствовать любому конкретному размеру целого числа. Если у вас более 20 цифр (или около того), вполне вероятно, что ваш компилятор не предоставит целочисленный тип, способный его содержать (даже если содержимое строки по-прежнему является допустимым целым числом с математической точки зрения).

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

bool is_int(char const *input) { 
    auto first = input;

    // check for leading minus sign
    if (*first == '-')
       ++first;

    // then check for digits:
    for ( ; *first && isdigit(*first); ++first)
        ;
    return *first == '\0';
}

Если вы хотите убедиться, что содержимое input действительно может быть преобразовано в int (как это определено целевой платформой), вы можете использовать что-то вроде std::stoi.

В качестве отступления: я бы посоветовал отказаться от вещей TCHAR. Microsoft разработала его как способ написания кода, который будет работать с широкими символами на их платформах на базе NT (Windows NT / 2k / XP) и узкими символами на их платформах на основе Windows 95 (95/98 / SE / Me). Последние давно устарели, и в первую очередь устраняют основную причину использования этого.

Если вы все равно настаиваете на его использовании, вам придется проделать небольшую работу, чтобы восполнить недостатки кода Microsoft. В частности, хотя они предоставили сопоставления в tchar.h для значительного числа подпрограмм манипуляции со строками, они никогда не предоставляли (или, по крайней мере, документировали) эквиваленты для таких вещей, как isdigit, поэтому вам придется реализовать свои собственные:

#ifdef _UNICODE
#define istdigit(c) iswdigit(c)
#else
#define istdigit(c) isdigit(c)
#endif

Тогда предыдущий код будет использовать макрос istdigit вместо isdigit.

Но, как уже отмечалось, лучший подход - это просто полностью избавиться от ерунды TCHAR. Какая небольшая мотивация когда-либо была, чтобы использовать это, давно прошло.

...