According to Section 7.4 of C99:
The header
<ctype.h>
declares several functions useful for classifying and mapping characters. In all cases the argument is anint
, the value of which shall be representable as anunsigned char
or shall equal the value of the macroEOF
. If the argument has any other value, the behavior is undefined.
The char
data type might, in any implementation, be signed or unsigned.
Non-Compliant Code Example
This non-compliant code example may pass illegal values to the ctype functions.
size_t count_whitespace(const char *s) { const char *t = s; while(isspace(*t)) /* possibly *t < 0 */ ++t; return t - s; }
Compliant Solution 2
This compliant solution uses an explicit cast.
size_t count_whitespace(const char *s) { const char *t = s; while(isspace((unsigned char)*t)) ++t; return t - s; }
References
- ISO/IEC 9899-1999 Section 7.4 Character handling <ctype.h>
- Kettlewell 02 Section 1.1 <ctype.h> And Characters Types