почему все еще идет внутрь, если? - PullRequest
0 голосов
/ 11 декабря 2018

Я действительно застрял в этой проблеме на несколько дней ..

нижеприведенная программа является частью более крупной программы, в которой пользователю предлагается ввести карту, например.2d, что означает (2 бриллианта).Моя проблема в функции "rank", которую я посылаю ей указателем на строку, и с помощью sscanf она выяснит, какой номер ввел пользователь и какой символ.давайте предположим, что пользователь ввел 2d, программа продолжит работать внутри этого (иначе, если (suit1! = 'c' || suit1! = 'd' || suit1! = 'h' || suit1! = 's') и ядействительно не понимаю почему, помогите плз?

#include <stdio.h>
#include <stdlib.h>

void rank (const char *s);

int main(){

    char text [20];

    printf("enter 2d");
    fgets(text, 4, stdin);

    rank(text);

    return 0;
}

void rank ( const char *s) {

    int num;
    char suit1;

    if((sscanf(s,"%d %c", &num , &suit1 )) == 2 ){

        if(num == 0 || num == 1){
            printf("bad rank 0 or 1");
            return 0;
        }
        else if(suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'){
           printf("Bad suit1!\n");
           return 0;
        }
        else
            printf("ok");
    }
}

1 Ответ

0 голосов
/ 11 декабря 2018

Состояние вашего else if всегда оценивается как true.

suit1 != 'c' || suit1 != 'd' || suit1 != 'h' || suit1 != 's'

Решение

Правильное состояние в вашем else if будет примерно таким:

!(suit1 == 'c' || suit1 == 'd' || suit1 == 'h' || suit1 == 's') // Using OR
suit1 != 'c' && suit1 != 'd' && suit1 != 'h' && suit1 != 's'    // Using AND

Разбиваем его на части

Давайте разберем ваше выражение на единичные условия:

suit1 != 'c' // Suit1 is not 'c'
suit1 != 'd' // Suit1 is not 'd'
suit1 != 'h' // Suit1 is not 'h'
suit1 != 's' // Suit1 is not 's'

Как вы видите, ваш код сначала проверяет, является ли suit1 не 'c',Есть две возможности:

  • Suit1 не равно 'c' => выражение возвращает true
  • Suit1 равно 'c' => программа продолжается и проверяетесли Suit1 равно 'd'.Программа достигает этой точки, только если Suit1 равно 'c'.Поскольку 'c' != 'd' условие true, и ваша программа всегда будет выполнять код в блоке else if.

Переписав условие

Вы можете изменить выражение на and && вместо or || и инвертировать все.

!(suit1 == 'c' && suit1 == 'd' && suit1 == 'h' && suit1 == 's')

Используя этот синтаксис, вы можетеясно видите, что suit1 просто не может иметь все эти значения одновременно.

...