删除字符串数组项并移动c中的其余项

时间:2013-12-14 21:48:10

标签: c arrays

第一个问题是:是否可以使用数组? 我已经看到一些建议说它不是使用列表而不是数组,但我的问题是我必须在我的程序中使用数组

`for(j=0;j<size_array;j++){
 if(strcmp(a[j],input)==0){
    strcpy(a[j], "\0");
    a[j] = a[j-1];
    size_array--;
}
}`

这是我尝试过的,它给了我以下结果:

a[0] = "apple"

a[1] = "banana"

a[2] =         //removed item

a[3] = "orange"

有没有办法将“橙色”移动到如此定位[2]:

a[0] = "apple"

a[1] = "banana"

a[2] = "orange"

提前致谢

3 个答案:

答案 0 :(得分:1)

您正在寻找memmove功能:

#include <string.h>
.
.
.
remove_item(a, offset);

// memmove(destination, source, nbytes)
memmove(a + offset, a + (offset + 1), (a_len - (offset + 1)) * sizeof a[0]);

例如,如果您有4个项目,并且您删除项目1(项目编号为0..3),您将执行以下操作:

// memmove(a + 1, a + (1+1), (4 - (1+1)) * sizeof a[0]);
memmove(a + 1, a + 2, 2 * sizeof a[0]);

由于sizeof始终为1,因此在sizeof(char)始终为1的情况下,可以省略{{1}}位的乘法,但为了完整性,我将其包括在内。

您也可以使用循环自己完成,我绝对建议您在有时间的情况下尝试这样做。它执行从源到目标的简单浅拷贝,注意重叠内存范围。有关该函数的更多信息,请参阅任何体面的C参考,因为它是标准C库的一部分。

答案 1 :(得分:1)

我怀疑你所显示的代码是打印你正在显示的输出,而不是它应该打印

a[0] = "apple"
a[1] = "banana"
a[2] = "banana"
a[3] = "orange"

无论如何......你真正需要的只是找到你要删除的字符串的索引,然后在退一步之后开始移动字符串。完成后,您可以减小阵列的大小。

因为你能够做a[j] = a[j-1]我假设你正在使用指针数组。在这种情况下,不需要strcpy(a[j], "\0");,只需将后一个元素移回一步就足够了。如果移除的字符串是动态分配的,那么您可能想要释放它的内存。

这是打印您期望的输出的示例:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(int argc, char** argv)  
{ 
    int size = 0, capacity = 10, i;
    char** array = malloc(sizeof(char*) * capacity);
    array[0] = strdup("apple");
    array[1] = strdup("banana");
    array[2] = strdup("pear");
    array[3] = strdup("orange");
    size = 4;

    for(i = 0; i < size; i++) {
        printf("%s\n", array[i]);
    }

    for(i = 0; i < size; i++) {
        if(strcmp(array[i], "pear") == 0) {
            free(array[i]);
            break;
        }
    }
    for(; i < size; i++) {
        array[i] = array[i+1];
    }
    size--;


    printf("\n");

    for(i = 0; i < size; i++) {
        printf("%s\n", array[i]);
    }

    return 0;  
} 

打印:

apple
banana
pear
orange

apple
banana
orange

答案 2 :(得分:0)

不幸的是,你不能只在C中弹出这个位置。如果你使用链接列表,就像你说的那样,你就可以。

您的代码中似乎有错误。因为您正在递增j并递减size_array,所以最终不会触及size_array/2+1之外的元素。

看起来你还在使用未发布的代码,这使得调试变得混乱,但你想要的代码看起来大致如下:

for(j=0;j<size_array-1;j++){
    if(strcmp(a[j],input)==0){
       strcpy(a[j], a[j+1]);
}

请注意,size_array是一个较小的,因为您不想检查列表的末尾,因为您无法对其进行任何操作。此外,对于字符串,您不能使用'='运算符。您必须使用strcpy或手动执行此操作。