Booleans на C языке - PullRequest
0 голосов
/ 01 мая 2020
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>



_Bool check_domain(char *domain) {
    int str_count = 0, x = strlen(domain), y = 0;
    if (domain[x-1] == '.' || domain[0] == '.'){
        return false; //if there is a period at start or end
    }
    else{
        while (domain[y]){
            if (str_count==2){
                return false; //if 2 consecutive periods
            }
            if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){ //if character is period or alphanumeric
                if (domain[y] == '.'){
                    str_count += 1;
                }
                else{
                    str_count = 0;
                }
            }
            else{ // if character is non period non alphanumeric
                return false;
            }
            y += 1;
        }
    }
    return true;
}

int main(void){
    char domain[] = "nus@edu.sg";
    printf("%d",check_domain(domain));
}

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы, теперь немного яснее по этому вопросу. Помимо отсутствия периода в конце или начале или двух последовательных периодов, в строке не должно быть непериодического, не алфавитного символа c. По причинам, которые я не могу понять, этот код не возвращает false для случаев, когда внутри строки есть непериодические, не алфавитные символы c.

1 Ответ

1 голос
/ 01 мая 2020

Начните здесь

if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){
                       ^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^

C не может обработать оператор, такой как n <= X <= m, как вы ожидаете.

C трактует это как:

(65<=domain[y]) <= 90
^^^^^^^^^^^^^^^    ^^
   bool         <= number

Итак, сначала C вычислит результат bool из 65<=domain[y], а затем сравнит этот bool с числом. Значение bool конвертируется в 0 или 1, поэтому при сравнении с 90 результат всегда будет истинным.

Если бы вы проверили предупреждения компилятора, вы бы увидели что-то вроде:

main.cpp:18:49: warning: comparison of constant '90' with boolean expression is always true [-Wbool-compare]

18 |             if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){
   |                                                 ^~

который говорит вам, что что-то не так.

Вам нужно написать

if (domain[y] == 46 || (65<=domain[y] && domain[y]<=90) || (97<=domain[y] && domain[y]<=122)){

КСТАТИ:

Не используйте маги c числа, такие как 65, 90 и скоро. Используйте вместо этого персонажа. Например:

(65<=domain[y] && domain[y]<=90) --> ('A' <= domain[y] && domain[y] <= 'Z')

Это значительно облегчает понимание кода.

Далее - рассмотрите возможность использования функции isalpha(domain[y]) для таких проверок.

Наконец - Ваш текст ( и имя функции) говорит, что вы хотите проверить доменное имя. Тем не менее, ваш ввод больше похож на адрес электронной почты.

...