输入合法性的校验与条件的真假
输入合法性校验
背景
在学习C语言过程中,输入并判断是否是闰年的题我已经做了很多了,但今天再次做这个题的时候,涉及到了输入合法性的校验
这个题目要求实现对输入合法性的校验,我直接傻眼了,不会写,
这是那一题的代码,看看AI怎么写的:
1 | |
如何实现
这里的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语法中的条件表达式好像和老师教的不一样!!!
- 先看 int is_leap = 0; 的作用
is_leap 是一个标志变量(用来标记“是否是闰年”):
- 初始值设为 0 (在C语言中, 0 代表“假”),默认假设“不是闰年”;
- 如果满足闰年条件,就把 is_leap 设为 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 | |
- 同理,我想起老师讲if的时候
如果括号中:
1 | |
如果是非0数字,比如1,100,-10086则被视为真,会继续执行if代码块
输入合法性的校验与条件的真假
http://example.com/2025/11/16/输入合法性校验与条件的真假/