использование isdigits, isalpha и ispunct в C - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь определить количество алфавитов, число и знаки препинания с помощью ввода пользователя, я получил номер числа, но алфавиты и знаки препинания неверны !! .

я не уверен почему .. это мой код

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    char str[50];
    int alphabet = 0 , number = 0, punct = 0;
    printf("Enter your sentence: ");
    fgets(str, sizeof(str),stdin);
    for(int i=0 ; i<50; i++)
   {
       if(isalpha(str[i]) != 0)
       {
           alphabet++;
       }
       else if (isdigit(str[i]) != 0 ){
           number++;
       }
       else if (ispunct(str[i]) != 0){
           punct++;
       }
   }
    printf("Your sentence contains:\n");
    printf("Alphabets: %d",alphabet);
    printf("\nDigits: %d",number);
    printf("\nPunctuation: %d",punct);

    return 0;
}

Ответы [ 2 ]

1 голос
/ 11 января 2020

Это l oop

for(int i=0 ; i<50; i++)

неверно. Введенная строка может быть меньше, чем размер массива символов str.

. Вместо этого используйте

for( size_t i = 0 ; str[i] != '\0'; i++ )

. Примите во внимание, что функция fgets может добавить символ новой строки \n' к введенной строке. Если вы хотите удалить его до l oop, напишите

#include <string.h>

//…

str[strcspn( str, "\n" )] = '\0';

Также в операторах if вы должны преобразовать данный символ в тип unsigned char. Например,

   if( isalpha( ( unsigned char )str[i] ) != 0)

или

   if( isalpha( ( unsigned char )str[i] ) )

В противном случае, как правило, без приведения такого вызова может вызвать неопределенное поведение, если код символа отрицательный.

0 голосов
/ 11 января 2020

Вы жестко закодировали верхнюю границу l oop: for(int i=0 ; i<50; i++), однако можете ли вы гарантировать, что ваш ввод длиной 49 символов? Если вы не можете, то вы будете читать значения мусора после '\ 0', вставленного fgets. Либо измените l oop (например): for(int i=0; i<50 && str[i]; i++) так, чтобы вы только l oop до конца ввода.

В качестве альтернативы, инициализируйте нулем входной буфер, то есть char str[50] = {0}; Я полагаю, что isalpha (), isdi git () и ispunct () возвращают false с нулевым вводом, поэтому не влияют на ваши результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...