Есть ли способ проверить прописные буквы и регистры isalpha для строк в массиве? - PullRequest
0 голосов
/ 21 апреля 2019
while(1)
    {

        char buff[1000];
        printf("Enter the word: ");
        fgets(buff, 1000, stdin);
        if(!strcmp(buff, "\n"))//empty search then break the loop
        {
            fprintf(stderr, "Exiting the program\n");
            break;
        }


        int error = 0;
        int i = 0;
        while(buff[i] != '\0')
        {

            if(buff[i] >= 33 && buff[i] <= 96)
            {
                break;
            }

            error = 1;
            i++;
        }

        if(error == 0)
        {
            fprintf(stderr, "Please enter something containing only lower-case letters\n");
        }

        }



Я ожидаю, что вывод hello World будет Please enter something containing only lower-case letters, но я не получаю эту ошибку. Если я ввожу World hello Я получаю ожидаемый результат, который выводит сообщение об ошибке.

Есть ли способ использовать isalpha для всего массива?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Вы не должны жестко кодировать буквенные значения, а использовать фактические значения. В этой проблеме любая буква вне диапазона от 'a' до 'z' недопустима Но это более переносимо, чтобы использовать библиотечные функции isalpha() и islower(), потому что значения букв не гарантированно являются последовательными.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    while(1) {

        char buff[1000];
        printf("Enter the word: ");
        fgets(buff, sizeof buff, stdin);
        if(!strcmp(buff, "\n")) {
            fprintf(stderr, "Exiting the program\n");
            break;
        }
        int error = 0;
        int i = 0;
        while(buff[i] != '\0') {
            if(isalpha(buff[i]) && !islower(buff[i])) {
                error = 1;
                break;
            }
            i++;
        }
        if(error == 1) {
            fprintf(stderr, "Please enter something containing only lower-case letters\n");
        }
    }
}

Программная сессия

Enter the word: hello world
Enter the word: Hello world
Please enter something containing only lower-case letters
Enter the word: hello World
Please enter something containing only lower-case letters
Enter the word: hello, world!
Enter the word:
Exiting the program
1 голос
/ 21 апреля 2019

Существуют библиотечные функции для проверки прописных и строчных букв.Они называются 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...