You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现only12函数校验int数组是否仅含1和2咨询

C语言only12函数实现方案及问题解答

核心问题说明

你遇到的长度计算错误是C语言的固有特性:

  • 数组作为函数参数传递时会自动退化为指针,sizeof(nums)得到的是指针本身的内存大小(32位系统4字节、64位系统8字节),和原数组的总长度完全无关,因此sizeof(nums)/sizeof(nums[0])的计算逻辑从根本上不成立。
  • 你后续固定size为5的实现仅能适配长度为5的数组,其余场景会出现越界访问或者校验遗漏,属于不可靠的临时写法。

空数组返回1的逻辑说明

这是数理逻辑中的「空真」规则:对于空集合的元素,所有全称判断都天然成立。空数组没有任何元素,不存在「不是1或2的元素」,所以满足「所有元素都是1或2」的条件,因此返回1。


正确实现方案

由于原原型无法获取数组长度,标准实现需要补充长度参数;如果必须严格遵循给定的无长度参数原型,需要约定数组以特殊哨兵值结尾,以下提供两种实现:

方案1:补充长度参数(推荐生产环境使用)

调整后函数原型

int only12(const int nums[], int numsSize)

实现代码

#include <stddef.h> // 用于NULL定义

int only12(const int nums[], int numsSize) {
    // 边界处理:传入NULL直接返回0
    if (nums == NULL) {
        return 0;
    }
    // 边界处理:空数组返回1
    if (numsSize <= 0) {
        return 1;
    }
    // 遍历所有元素校验
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != 1 && nums[i] != 2) {
            return 0;
        }
    }
    // 所有元素都符合要求
    return 1;
}

调用示例

  • only12((int[]){1,2,2}, 3) 返回1
  • only12((int[]){1,4,2,4}, 4) 返回0
  • only12(NULL, 0) 返回0
  • only12((int[]){}, 0) 返回1

方案2:严格遵循原无长度参数原型(约定哨兵结尾)

如果必须保留int only12(const int nums[])的原型,约定数组最后一个元素为哨兵值-1(不会出现在合法输入的1、2中):

实现代码

#include <stddef.h>

int only12(const int nums[]) {
    if (nums == NULL) {
        return 0;
    }
    // 遍历到哨兵为止
    for (int i = 0; nums[i] != -1; i++) {
        if (nums[i] != 1 && nums[i] != 2) {
            return 0;
        }
    }
    return 1;
}

调用示例

  • only12((int[]){1,2,2,-1}) 返回1
  • only12((int[]){-1}) 对应空数组,返回1

内容的提问来源于stack exchange,提问作者cProgramming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 06:06:02