Одной из очевидных возможностей будет использование регулярного выражения с шаблоном, например, -?[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
. Какая небольшая мотивация когда-либо была, чтобы использовать это, давно прошло.