从char *中删除char并返回char *

时间:2013-11-02 18:01:08

标签: c

我有一个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;
}

5 个答案:

答案 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次。