我最近才开始使用C ++,并且很难移动数组元素以删除空/ null元素
char *aBlock;
aBlock = new char[100];
int main(int argc, char **argv)
{
aBlock[20] = 'a'; // fill array with test data.
aBlock[10] = 's';
aBlock[30] = 'd'; // Excepted output: This test data should be shifted to the start of array
// Consider aBlock contains data, with random empty elements
for(int i=1; i <= aBlock.length(); i++) {
if(aBlock[i-1] == 0) {
aBlock[i-1] = aBlock[i];
aBlock[i] = 0;
}
}
return 0;
}
编辑: 修正了一个代码拼写错误错误的变量名称,已更改&#34; ==&#34;到&#34; =&#34;。 它仍然没有按预期工作。
答案 0 :(得分:0)
更改
memBlock[i-1] == memBlock[i];
到
memBlock[i-1] = memBlock[i];
&#34; ==&#34;是我认为的问题。
使用
if(aBlock[i-1] != 0)
答案 1 :(得分:0)
运算符==
检查相等性,您必须使用=
进行分配。
memBlock[i-1] = memBlock[i];
C ++中的数组没有像.length()
这样的成员。他们不是班级。
for(int i=1; i <= 100; i++)
^^^
答案 2 :(得分:0)
如果我理解正确,您希望在数组的开头移动非零元素。您可以使用std::remove_if
执行此操作,并将其余元素设置为0。
std::fill(
std::remove_if(std::begin(aBlock), std::end(aBlock), [](char const c) {return c == '\0'; }),
std::end(aBlock),
0);
更新:
由于数组是动态分配的,因此需要进行一些小改动:
std::fill(
std::remove_if(&aBlock[0], &aBlock[100], [](char const c) {return c == '\0'; }),
&aBlock[100],
0);
答案 3 :(得分:0)
如果您在编译时知道大小,请使用std :: array(如果可用)。然后你可以做&#34; .size()&#34; :)此外,如果你有几个连续的零,你的代码不起作用。每个元素最多向左移动一次,这显然不足以实现您想要的结果。你需要做的是跟踪一个单独的&#34;输出&#34; index / iterator,它接收你遇到的任何非零值,然后递增:
std::array<char, 100> aBlock;
aBlock[10] = 's';
aBlock[20] = 'a';
aBlock[30] = 'd';
auto output = aBlock.begin(); // or aBlock if you don't have std::array;
for (auto input = aBlock.begin(); input != aBlock.end(); ++input)
{
if (*input != 0)
{
if (output != input)
{
*output = input;
*input = 0;
}
++output;
}
}
这应该可以解决问题。
答案 4 :(得分:0)
int arrsize = 100;
...
int i, j;
for(i = 0, j = 0; i < arrsize ; i++) {
if(memBlock[i] != 0 && i != j) {
memBlock[j++] = memBlock[i];
memBlock[i] = 0;
}
}
旁注:全球空间新增?哪里有删除[]?