Существуют библиотечные функции для проверки прописных и строчных букв.Они называются isupper
и islower
.Используй их.Хотя это необычно, когда 'a'
является чем-то другим, чем 97, это может случиться.Если вы имеете в виду букву 'a'
, тогда используйте символьный литерал 'a'
вместо числа 97. Более того, даже буквы не гарантированно являются последовательными, поэтому 'z'-'a'
не гарантированно будет равно 22. Однакоцифры должны быть последовательными, поэтому '9'-'0'
всегда будет иметь значение 9. Но гораздо безопаснее полагаться на библиотечные функции, такие как isalpha
и тому подобное.Я написал о кодировке здесь: https://stackoverflow.com/a/46890148/6699433
Чтобы исправить ошибку, вам нужно правильное условие.Согласно вашему вопросу, он должен напечатать сообщение об ошибке, если какой-либо из символов не является ни строчными, ни пробелами.Кроме того, ваш код слишком сложен.Вот решение:
int i = 0;
while(buff[i] != '\0') {
if(!(islower(buff[i]) || isspace(buff[i]))) {
fprintf(stderr, "Please enter something containing only lower-case letters\n");
break;
}
i++;
}
Есть ли способ использовать isalpha для всего массива?
C не имеет встроенной функциональности для таких вещей, ноВы можете написать свой собственный преобразователь.
/* Apply function f on each of the elements in str and return false
* if f returns false for any of the elements and true otherwise.
*/
bool string_is_mapper(const char *str, size_t size, int (*f)(int c))
{
for(int i=0; i<size && str[i] != '\0'; i++)
if(!f(str[i])) return false;
return true;
}
Теперь вы можете использовать этот преобразователь следующим образом:
if(string_is_mapper(str, strlen(str), isupper)
puts("All characters in str is upper case");
Вы даже можете написать свои собственные функции для плагина, если они подходятэтот прототип:
int condition(int c);