找出程序错误int main() { char arr[] = { 0x07,0x99,0x99,0x00,0x54,0x88,0x33,0x22 }; char dest[10] = { 0 }; char* ptr = NULL; ptr = arr; int len = ptr[0]; while (len - 4 > 0) { if ((*ptr == 0x99) && (*(ptr + 1) == 0x99)) { memcpy(dest, ptr + 2, len - 2); } ptr++; len--; } for (int i = 0; i < 10; i++) { printf("%d\n", dest[i]); } }
时间: 2024-02-07 07:02:52 浏览: 60
ANSI_C99 (pdf文档)
5星 · 资源好评率100%
程序错误在于memcpy函数的使用。每次循环时,如果找到了两个连续的0x99,就会执行memcpy把ptr+2开始的数据拷贝到dest数组中,但是每次拷贝都是从dest数组的起始位置开始,而并没有考虑到已经拷贝的数据的数量,因此会覆盖之前已经拷贝的数据。应该在memcpy的第三个参数中传入剩余的数据长度,而不是固定的len-2。正确的代码应该是这样的:
```
int main() {
char arr[] = { 0x07,0x99,0x99,0x00,0x54,0x88,0x33,0x22 };
char dest[10] = { 0 };
char* ptr = NULL;
ptr = arr;
int len = ptr[0];
while (len - 4 > 0)
{
if ((*ptr == 0x99) && (*(ptr + 1) == 0x99))
{
memcpy(dest, ptr + 2, len - 2);
break;
}
ptr++;
len--;
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", dest[i]);
}
}
```
修改后的代码会在找到第一个符合条件的位置后立即退出循环,并且每次拷贝的数据长度都是剩余的数据长度,从而避免了覆盖已经拷贝的数据。
阅读全文