if陈述即使输入正确也总是正确的?

时间:2019-05-18 11:47:56

标签: c if-statement

我正在检查项目中输入的月份。 我扫描了2个字符。假设我成功地将“ 10”作为输入。 然后通过一个if语句,我询问编译器输入的值是大于12还是小于01,但是在任何情况下,if语句始终为true。

#define MAX_DAY 2
#define MAX_MONTH 2
#define MAX_YEAR 4

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

typedef struct {
    char day[MAX_DAY];
    char month[MAX_MONTH];
    char year[MAX_YEAR];
} date; //struct data

typedef struct {
    date date_of_flight;
} flight; //struct volo

int CheckMonth (flight list1);

int main() {

    flight list;

    int correct = 0;

    while (correct != 1) {
    printf("Month of departure: ");
    scanf("%2s", list.date_of_flight.month);
    correct = CheckMonth(list);
    }

    return 0;
}

int CheckMonth (flight list1) {

    int correct = 0;

    if ((list1.date_of_flight.month > 12) || (list1.date_of_flight.month < 01))  {
        printf("Wrong input. The right input should be between 01 (January) and 12 (December).\n");
    }
    else
    {
        correct = 1;
    }
    return correct;
}

如果您问自己为什么我使用 char month [] 而不是简单的int,这是因为如果我通过int扫描“ 05”,则scanf只会读取5。 / p>

1 个答案:

答案 0 :(得分:4)

您需要比较函数中的字符串。

if ((list1.date_of_flight.month > 12) || (list1.date_of_flight.month < 01))  {
    printf("Wrong input. The right input should be between 01 (January) and 12 (December).\n");

实际上应该是:

if ((strcmp(list1.date_of_flight.month, "12") > 0 ) || (strcmp(list1.date_of_flight.month, "01") < 0))  {
    printf("Wrong input. The right input should be between 01 (January) and 12 (December).\n");
}

strcmp()<string.h>中的函数。如果两个字符串相等,则返回0。

如果第一个字符串中的第一个不同字符基于第二个字符串中的第二个字符,则返回负数。

否则,它将返回一个正数。