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