C Программа для подсчета количества алфавитов в слове с ошибкой

Ниже приведен код:

#include<stdio.h>

int main()
{
    int alpha = 0, input;

    while((input = getchar() != EOF))
    {
        if(isalpha(input))
            alpha++;
    }

    printf("Num of alpha is %d", alpha);
    return(0);
}

Я получаю сообщение об ошибке

isalpha не был объявлен в этой области

при компиляции на компиляторе DevC++.


person Ganesh Mallya    schedule 12.05.2021    source источник
comment
Попробуйте найти документацию о функции isalpha. Он скажет вам, что вам нужно #include определенный заголовочный файл.   -  person Some programmer dude    schedule 12.05.2021
comment
Предполагается, что параметр isalpha() должен быть приведен к unsigned char до вызова функции (isalpha( (unsigned char)input )). Невыполнение этого требования может привести к проблемам на некоторых машинах, где char подписано.   -  person DevSolar    schedule 12.05.2021
comment
@DevSolar Этот состав действительно необходим?   -  person klutt    schedule 12.05.2021
comment
@klutt Действительно, я принял это за другой вариант использования, когда аргумент равен char или signed char. Нет, здесь нет строгой необходимости. Но это хорошая привычка, потому что ошибки, которые вы не делаете, могут быть трудно поймать.   -  person DevSolar    schedule 12.05.2021
comment
@DevSolar Лично я бы сказал, что приведение типов, когда в этом нет необходимости, - очень плохая привычка, поскольку это легко может скрыть ошибки. Но если вы ограничите это семейством isxxxx, я согласен.   -  person klutt    schedule 12.05.2021
comment
@klutt Да, я имел в виду строго для семейства функций is...() / to...().   -  person DevSolar    schedule 12.05.2021


Ответы (1)


isalpha() объявлен в ctype.h

Было бы полезно знать, что, хотя аргумент для isalpha (и всех функций семейства isxxx) является int, поведение не определено, если аргумент отрицательный. Так что, если вы работаете на машине, где char подписано по умолчанию, вы можете столкнуться с проблемами, если не выполните приведение первым. Так:

char c;
// Some code
if(isalpha((unsigned char) c)) {

Это может быть хорошей привычкой всегда использовать эти функции. Однако НЕ используйте кастинг в качестве перехода для отключения предупреждений. Он может легко скрыть ошибки. В большинстве случаев, когда требуется приведение, ваш код неверен по какой-то другой причине. Разглагольствования о кастинге

Еще одна ловушка с этими функциями (и многими другими функциями C, которые возвращают int как логическое значение) заключается в том, что они должны возвращать ноль в случае false, но могут возвращать любое ненулевое значение в случае true. Так что такая проверка - полный бред:

if( isalpha(c) == 1 ) 

Вместо этого выполните любое из следующих действий:

if( isalpha(c) != 0 )   // If not zero
if( isalpha(c) )        // Use directly as Boolean (recommended)
if( !! isalpha(c) == 1) // Double negation turns non zero to 1
person klutt    schedule 12.05.2021