如何修改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
相关产品推荐
相关产品推荐

