Несколько человек уже упоминали, чтобы использовать isdigit()
.Тем не менее, обратите внимание, что это не совсем тривиально, поскольку char
может быть подписано, что приведет к передаче отрицательного значения в isdigit()
.Однако эта функция может принимать только положительные значения.То есть вы хотите что-то похожее на это:
if (s.end() == std::find_if(s.begin(), s.end(),
[](unsigned char c)->bool { return !isdigit(c); })) {
std::cout << "string '" << s << "' contains only digits\n";
}
Кажется, причина для преобразования в unsigned char
не очевидна.Итак, вот соответствующие цитаты из их соответствующих стандартов:
В соответствии с ISO / IEC 9899: 2011 (или ISO / IEC 9899: 1999), параграф 1 7.4, следующее относится к аргументам функций из <ctype.h>
:
... Во всех случаях аргументом является int
, значение которого должно быть представлено как unsigned char
или равным значению макроса EOF
.Если аргумент имеет какое-либо другое значение, поведение не определено.
К сожалению, стандарт C ++ не определяет, что char
является неподписанным типом.Вместо этого он указывает в ISO / IEC 14882: 2011 3.9.1 [basic.fundamental] параграф 1:
... Определяется реализацией, может ли объект char
содержать отрицательные значения....
Очевидно, что отрицательное значение не может быть представлено как unsigned char
.То есть, если char
использует подписанный тип в реализации (на самом деле есть несколько, которые делают, например, он подписан в MacOS с использованием gcc или clang), существует опасность, что вызов любой из функций <ctype.h>
вызоветнеопределенное поведение.
Теперь, почему преобразование в unsigned char
делает правильные вещи?
Согласно 4.7 [conv.integral] параграфу 2:
Если тип назначения является беззнаковым, полученное значение является наименьшим целым числом без знака, соответствующим исходному целому числу (по модулю 2 n , где n - число битов, используемых для представления типа без знака).[Примечание: в представлении дополнения до двух это преобразование является концептуальным, и в битовой комбинации нет изменений (если нет усечения).- конец примечания]
То есть преобразование из [потенциально] подписанного char
в unsigned char
является четко определенным и приводит к тому, что результат находится в допустимом диапазоне для <ctype.h>
функции.