我有一个char数组,我想删除满足我条件的字符。示例我有一个char数组A = {1,-1,0,1,-1},我想删除等于-1的元素。这意味着输出是{1,0,1},我想检查数组中有多少元素。在我的例子中是3.你能帮帮我吗?
char* delete_char(char* sourceArray, char inputChar)
{
char* out=NULL;
//Need to malloc memory. But I don't know how many size will allocate because it depends on how many element that don't equal -1
return out;
}
int sizeofArray(char* sourceArray)
{
return size;
}
答案 0 :(得分:3)
你有一些策略:
在分配之前计算确切的大小。
估算大小。
分配一个大尺寸的内存(在最坏的情况下你可能知道最大尺寸)。
在后两种情况下,您可以使用realloc
缩小内存。在您的代码中,如果数组是以零结尾的字符串,则估计的大小为strlen(sourceArray)+1
,因为删除结果的次数少于等于它。
答案 1 :(得分:2)
首先,当您使用char *作为数组时,还需要提供有关该数组长度的信息(它包含多少项)。通常,这是通过第二个参数完成的。
在您的情况下:delete_char(char *inputArray, char inputArraySize, char inputChar)
。
然后你应该将你的结果数组分配给输入数组的大小(因为它最多可以包含与输入数组一样多的项目)。
之后,您应该遍历输入数组中的每个项目,如果该项目符合您的条件,请将其添加到结果数组中。当然,您还必须提供输出数组的大小(例如在另一个输出参数中),这样您就可以使用它。
最后,当您完成使用生成的数组时,不要忘记取消分配它的所有内存(这意味着将其解除分配,因为它是原始输入数组的大小,因为它最初是)。
答案 2 :(得分:1)
你可以自己编写这样的函数。
int size(char *ptr)
{
int offset = 0;
int count = 0;
while (*(ptr + offset) != '\0')
{
++count;
++offset;
}
return count;
}
答案 3 :(得分:1)
您可以扫描数组以确定要删除的元素数,然后分配和适当的内存,然后复制。例如:
int sizeNeeded = 0;
for (int i = 0; i < sizeofArray(sourceArray; i++) {
if (sourceArray[I] != inputChar) sizeNeeded++;
}
char *rv = (char *) malloc(sizeNeeded * sizeOf(char));
int j = 0;
for (int i = 0; i < sizeofArray(sourceArray; i++) {
if (sourceArray[I] != inputChar) rv[j++] = sourceArray[i];
}
我没有尝试编译这段代码,但它应该传达这个想法
答案 4 :(得分:1)
这是:
#include <string.h>
char* delete_char(char* sourceArray, char inputChar)
{
int iNr = 0,iSize,j = 0;
iSize = strlen( sourceArray );
for( int i = 0; i < iSize; i++ )
if( sourceArray[i] == inputChar )
iNr ++;
char *newarray = new char[iNr +1];
for( int i = 0; i < iSize; i++ )
{
if( sourceArray[i] != inputChar )
newarray[j++] = sourceArray[i];
}
return newarray;
}
int sizeofArray(char* sourceArray)
{
return strlen( sourceArray );
}
PS测试。它有效,但可能效率不高,因为你检查了2次。