Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在char中每x删除x字节_C++_Winapi_Byte - Fatal编程技术网

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

C++ C++;在char中每x删除x字节,c++,winapi,byte,C++,Winapi,Byte,嗨,对于我的应用程序,我需要删除字符数组上的空字节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

嗨,对于我的应用程序,我需要删除字符数组上的空字节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。一个明显的方法是从头到尾遍历数组,跟踪两点:“输入”和“输出”。这两个字节的开头相同(数组的开头),但每次遇到结果中不需要的字节时,都会将输入移动到下一个字节,但不处理输出。当您遇到确实要保留的字节时,您将从输入点复制到输出点,然后更新它们以指向下一个字节。

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

@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
}
//从数组中删除所有'\x00'元素
int删除0(字符a[],int len)
{
int si;//源索引
int di;//目标索引
//从左到右扫描阵列,删除“\x00”元素
di=0;
对于(si=0;si
随着循环的进行,
di
索引保证不大于
si
if
条件可以修改为在数组中保留元素所需的任何条件


注意:为了完全迂腐,索引和长度应该是type
size\u t
,以便可以处理任何大小的数组。我使用
int
只是为了让事情变得简单。

@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
}
//从数组中删除所有'\x00'元素
int删除0(字符a[],int len)
{
int si;//源索引
int di;//目标索引
//从左到右扫描阵列,删除“\x00”元素
di=0;
对于(si=0;si
随着循环的进行,
di
索引保证不大于
si
if
条件可以修改为在数组中保留元素所需的任何条件


注意:为了完全迂腐,索引和长度应该是type
size\u t
,以便可以处理任何大小的数组。我使用
int
只是为了简单起见。

在我看来似乎是一个不错的解决方案。O(n)时间,O(n)内存(少于两倍)。@VictorZamanian:它不使用额外内存(除了输入/输出指针/索引本身)。输入和输出都只是指向原始数组的指针/索引,所以您只是将字节从输入数组的一部分复制到输入数组的另一部分。啊,我明白了。谢天谢地,我用这样一种方式来表达它,它仍然有效谢谢你的解释!在我看来这是个不错的解决办法。O(n)时间,O(n)内存(少于两倍)。@VictorZamanian:它不使用额外内存(除了输入/输出指针/索引本身)。输入和输出都只是指向原始数组的指针/索引,所以您只是将字节从输入数组的一部分复制到输入数组的另一部分。啊,我明白了。谢天谢地,我用这样一种方式来表达它,它仍然有效谢谢你的解释!您的标题(在char中每个x删除x字节)和描述(我需要在char数组中删除空字节)是两种不同的情况。另外,您的示例非常混乱,因为在nul字符(\x00)旁边,您还从\x0B8中删除了0\x00'和“0”完全不同。您的标题(在字符中每x删除x字节)和描述(我需要在字符数组中删除空字节)是两种不同的情况。另外,您的示例非常混乱,因为在nul字符(\x00)旁边,您还从\x0B8中删除了0\x00'和“0”完全不同。这不是我真正想要的,我会选择一个间隔,每X字节删除一个选择。这个选择可以是任何不一定为空的字节。您的问题说得不太清楚,所以我给出了一个非常一般的答案。您可以更改我的代码中的
if
条件以删除/保留任何特定字符;例如,
a[si]!='\x00'&&si%x==0
。这并不是我真正想要的,我会选择一个间隔,每x字节删除一个选择。这个选择可以是任何不一定为空的字节。您所说的问题不是很清楚,所以我给出了一个非常一般的答案。您可以更改我的代码中的
if
条件以删除/保留任何特定字符;例如,
a[si]