0

我有一个字符数组,我想删除满足我条件的字符。示例 我有一个 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;
}
4

5 回答 5

3

你有一些策略:

  • 在分配之前计算确切的大小。

  • 估计一个大小。

  • 分配大容量内存(在最坏的情况下您可能知道最大容量)。

在后面两种情况下,您可以使用realloc来缩小内存。在您的代码中,估计的大小是strlen(sourceArray)+1数组是否以零结尾的字符串,因为通过删除结果小于等于它。

于 2013-11-02T18:10:44.960 回答
2

首先,当您使用 char* 作为数组时,您还需要提供有关该数组长度的信息(它包含多少项)。通常这是由第二个参数完成的。

在你的情况下:delete_char(char *inputArray, char inputArraySize, char inputChar)

然后,您应该将结果数组分配为输入数组的大小(因为它最多可以包含与输入数组一样多的项目)。

之后,您应该遍历输入数组中的每个项目,如果该项目满足您的条件,则将其添加到结果数组中。当然,您还必须提供输出数组的大小(例如在另一个输出参数中),以便您可以使用它。

最后,当你处理完结果数组时,不要忘记释放它的所有内存(这意味着释放它,因为它是原始输入数组的大小,因为它实际上是)。

于 2013-11-02T18:19:06.560 回答
1

你可以像这样编写自己的函数。

int size(char *ptr)
{

    int offset = 0;
    int count = 0;

    while (*(ptr + offset) != '\0')
    {
        ++count;
        ++offset;
    }
    return count;
}
于 2013-11-02T18:08:07.733 回答
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];
    } 

我没有尝试编译这段代码,但它应该传达这个想法

于 2013-11-02T18:12:58.580 回答
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 次。

于 2013-11-02T18:18:53.027 回答