A few years late to this party.
Take advantage that isalpha('\0') is false
CallingSince char may be signed, calling isalpha(ch) is undefined behavior (ub) when ch < 0 && ch != EOF. is...(ch) are specified to work when ch is in the range [0...UCHAR_MAX] and EOF. C2X draft § 7.4 1
Maybe better to say: "The parameter c pointpoints to a C string."
Be aware of locale issues
In the default locale there are 26 + 26 characters that return isalpha() as non-zero (true). Other locales may have more. Depending on coding goals this is an advantage or not.
If code goal is only the common A-Z, a-z regardless of locale, consider making your own table.
static const unsigned char is_az[UCHAR_MAX + 1] = { //
['A'] = 1, ['B'] = 1, /* 23 more */, ['Z'] = 1,
['a'] = 1, ['b'] = 1, /* 23 more */, ['z'] = 1,
}; // The rest will be 0.
unsigned char [] array used here as it is more compact that bool [] when bool is size > 1. We could use bits of the array, but let us leave that for later.