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

如何修改edge函数的指针算术逻辑实现二进制条码边缘检测?

问题分析

你原有代码存在几处核心错误,不符合需求和C语言语法规则:

  • 循环条件非法:指针是内存地址,不能直接与数组长度n比较,正确的终止条件是输入指针不超过输入数组首地址+长度的位置
  • 比较逻辑存在未定义行为:*p != *p++的写法属于同一表达式内多次修改同一变量,结果不可预测,也不符合需求中「当前位与前一位比较」的要求
  • 未处理输出首位固定为0的规则:需求明确输出数组第一位恒为0,原有逻辑没有做这个初始化
  • 自增逻辑错误:指针移动节奏不对,会导致数组访问越界或值对应错误

正确实现代码

修改后的代码完全符合「仅用指针算术、不使用下标运算符和循环索引变量」的要求:

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

void edge(int *a1, int *a2, int n);

int main() {
    int i;
    int n = 8;
    int arr[] = {0,0,1,0,1,1,0,1};
    int arr2[n];
    for(i = 0; i < 8; i++) {
        printf("%d", arr[i]);
    }
    edge(arr, arr2, n);
    printf("\n");
    for(i = 0; i < 8; i++) {
        printf("%d", arr2[i]);
    }
    return 0;
}

void edge(int *a1, int *a2, int n) {
    // 输出第一位固定为0
    *a2 = 0;
    // 边界处理:数组长度为1时直接返回
    if(n <= 1) return;
    // 输入指针从第二位开始,输出指针同步从第二位开始
    int *p = a1 + 1;
    int *q = a2 + 1;
    while(p < a1 + n) {
        // 比较当前位和前一位的值,赋值对应输出位
        *q = (*p != *(p - 1)) ? 1 : 0;
        // 指针后移
        p++;
        q++;
    }
}

验证结果

输入测试用例00101101,运行后输出为00111011,和示例要求完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:39:04