输入合法性的校验与条件的真假

输入合法性校验

背景

在学习C语言过程中,输入并判断是否是闰年的题我已经做了很多了,但今天再次做这个题的时候,涉及到了输入合法性的校验
这个题目要求实现对输入合法性的校验,我直接傻眼了,不会写,

这是那一题的代码,看看AI怎么写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main() {
int year;
// 读取输入并判断是否为合法整数
if (scanf("%d", &year) != 1 || year < 1) {
printf("Input error!\n");
return 0;
}

// 闰年判断逻辑
int is_leap = 0;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
is_leap = 1;
}

// 输出结果
if (is_leap) {
printf("Yes\n");
} else {
printf("No\n");
}

return 0;
}

如何实现

这里的scanf("%d", &year) != 1判断的是输入是否成功读取为整数,原理是利用 scanf 的返回值是「成功读取的变量个数」。比如 scanf("%d", &year) 尝试读取1个整数变量:

  • 如果输入的是整数(比如 2015 ),scanf成功读取1个变量,返回 1 ;
  • 如果输入的不是整数(比如 a ),scanf无法读取,返回 0 ;
  • 如果输入失败(比如输入结束),返回 EOF (一个负数,通常是 -1 )。

所以scanf(...) != 1的含义是: scanf 没有成功读取1个整数” → 说明输入不是合法的整数。

举个例子:

  • 当你输入 a 时, scanf("%d", &year) 无法把 a 解析成整数,返回 0 ,此时 0 != 1 成立,执行 printf("Input error!")
  • 当你输入 2016 时, scanf 返回 1 , 1 != 1 不成立,继续执行后续逻辑。

番外

如果仔细观察代码

会发现代码实现了输入合法性检验后定义了一个变量’’is_leap’’

并且后面的if语法中的条件表达式好像和老师教的不一样!!!

  1. 先看 int is_leap = 0; 的作用

is_leap 是一个标志变量(用来标记“是否是闰年”):

  • 初始值设为 0 (在C语言中, 0 代表“假”),默认假设“不是闰年”;
  • 如果满足闰年条件,就把 is_leap 设为 1 ( 1 代表“真”),表示“是闰年”。
  1. 再看 if (is_leap) 的逻辑

在C语言的 if 判断中,条件表达式的结果会被当作“布尔值”处理:

  • 如果条件表达式的结果是 0 ,视为“假”,不执行 if 后的代码块;
  • 如果条件表达式的结果非0(比如 1 、 -5 等),视为“真”,执行 if 后的代码块。

所以 if (is_leap) 等价于 if (is_leap != 0) ——判断 is_leap 的值是否“非0”:

  • 当 is_leap=1 (满足闰年条件)时, if (is_leap) 为“真”,执行 printf("Yes\n");
  • 当 is_leap=0 (不满足闰年条件)时, if (is_leap) 为“假”,执行 else 后的 printf("No\n");
为什么这么写?

这是C语言中很常见的“简化写法”——当变量本身就是“标志(0/非0)”时,直接用变量作为条件,比写 if (is_leap == 1) 更简洁(逻辑完全一致)。

举个类似的例子:

1
2
3
4
int flag = 1;
if (flag) { // 等价于 if(flag != 0)
printf("真\n");
}
  • 同理,我想起老师讲if的时候

如果括号中:

1
2
3
4
5
if (0){
//这个中括号逼用没有,0即为假,不会执行if代码块
}


如果是非0数字,比如1,100,-10086则被视为真,会继续执行if代码块


输入合法性的校验与条件的真假
http://example.com/2025/11/16/输入合法性校验与条件的真假/
作者
王柏森
发布于
2025年11月16日
许可协议