第一个问题是:是否可以使用数组? 我已经看到一些建议说它不是使用列表而不是数组,但我的问题是我必须在我的程序中使用数组
`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"
提前致谢
答案 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
或手动执行此操作。