C ++在char中每x都删除x字节

时间:2013-05-24 14:34:34

标签: c++ winapi byte

您好我的应用程序我需要删除char数组evry X字节上的空字节,如:

char a[] = "\x0B8\x0B8\x0B8\x0B8\x00\x0B8\x0B8\x0B8\x0B8\x00\x0B8\x0B8\x0B8\x0B8\x00\x0B8\x0B8\x0B8\x0B8\x00\x0B8\x0B8\x0B8\x0B8\x00\x0B8\x0B8\x0B8\x00\x00"

需要

char a[] = "\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8\xB8";

我需要一个没有std的功能只需WINAPI谢谢

2 个答案:

答案 0 :(得分:2)

@Jerry Coffin描述了这种一般问题的惯用解决方案。

您需要就地扫描和修改数组,从左向右扫描,保留或删除元素,同时跟踪源(输入)索引和目标(输出)索引。由于这会扫描数组的每个元素一次,因此它是一个O( n )算法。

例如:

// Remove all '\x00' elements from an array
int remove_zeros(char a[], int len)
{
    int  si;   // Source index
    int  di;   // Destination index

    // Scan the array from left to right, removing '\x00' elements
    di = 0;
    for (si = 0;  si < len;  si++)
    {
        if (a[si] != '\x00')
            a[di++] = a[si];    // Keep/move the element
        // Otherwise skip/remove the element
    }

    return di;   // Resulting length of the modified array
}

随着循环的进行,di索引保证不会大于si。可以将if条件修改为保留数组中元素所需的任何条件。

注意:要完全迂腐,索引和长度应为size_t类型,以便可以处理任何大小的数组。我使用int只是为了简单起见。

答案 1 :(得分:1)

一种显而易见的方法是从头到尾遍历数组,跟踪两点:“输入”和“输出”。两者将以相同的方式(数组的开头)开始,但每次遇到结果中不需要的字节时,您都会将输入移动到下一个字节,但只保留输出。当您遇到要保留的字节时,您将从输入点复制到输出点,然后更新它们以指向下一个字节。