在数组中删除尾随的零

Removing trailing zeros in an array

本文关键字:删除 数组      更新时间:2023-10-16

我正在尝试创建一个不会在数组中打印尾随零的程序。
我的数组大小是23。我试图从A for循环的第23位开始,并在达到一个循环后结束for循环。然后,我只会打印到那个位置。不过,我似乎无法做对。有人可以帮我吗?
谢谢

void removeTrailZero(int array[]) {
    int i = 0;
    for (i = 23; array[i] == 0; i--) {
        // printf("%d", i);
    }
    for (int x = 1; x < i + 1; x++) {
        printf("%d",array[x]);
    }
}

您可以做这样的事情

for (i = 22; i >= 0; --i)
{
    if (array[i] != 0)
        break;
}

然后在0和i之间打印您的数组(包括(

现在,您的代码看起来像C,而不是C 。至少假设标签是正确的,您确实想编写C 而不是C,我会考虑使用标准库中的某些算法来处理工作的至少一部分。

标准库有一个std::find_if用于查找您关心的价值。这与迭代器一起使用,而不是直接与基础存储在一起。由于您想从头开始搜索,因此可以使用reverse_iterator找到正确的点:

auto last = std::find_if(std::crbegin(array), std::crend(array), 
    [](auto i) { return i != 0; });

当我们打印数据时,我们希望通过从头到时到该点的阵列迭代 forward - 但这是一个反向_erterator,因此我们需要调用其 base()以获取远期迭代器,并将其作为我们要打印的范围的末端:

std::copy(std::cbegin(array), last.base(),
          std::ostream_iterator<int>(std::cout, "n"));

如果使用C 14 -std=c++14编译,则可以使用答案的@JerryCoffin:

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string>
template <std::size_t SIZE>
void removeTrailZero(const std::array<int, SIZE>& array) {
    auto last = std::find_if(std::crbegin(array), std::crend(array),
        [](auto i) { return i != 0; });
    std::copy(std::cbegin(array), last.base(),
        std::ostream_iterator<int>(std::cout, " "));
}
int main() {
    std::array<int, 23> array1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array1);
    std::cout << std::endl;
    std::array<int, 15> array2 = {1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array2);
    std::cout << std::endl;
}

输出:

❯❯❯ g++ -std=c++14 ../test.cc -o test && ./test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 0 0 4 5 6

用于使用C 11 -std=c++11编译,您可以使用:

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string>
template <std::size_t SIZE>
void removeTrailZero(const std::array<int, SIZE>& array) {
    auto last = std::find_if(array.crbegin(), array.crend(),
        [](int i) { return i != 0; });
    std::copy(array.cbegin(), last.base(),
        std::ostream_iterator<int>(std::cout, " "));
}
int main() {
    std::array<int, 23> array1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array1);
    std::cout << std::endl;
    std::array<int, 15> array2 = {1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array2);
    std::cout << std::endl;
}

输出:

❯❯❯ g++ -std=c++11 ../test.cc -o test && ./test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 0 0 4 5 6

对于C 11的较旧版本,您可以使用:

#include <iostream>
void removeTrailZero(int array[]) {
    int i = 22;
    for (; i >= 0 && array[i] == 0; --i);
    for (int j = 0; j <= i; ++j) {
        std::cout << array[j] << " ";
    }
}
int main() {
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array);
    std::cout << std::endl;
    int array2[] = {1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    removeTrailZero(array2);
    std::cout << std::endl;
}

输出:

❯❯❯ g++ ../test.cc -o test && ./test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 0 0 4 5 6

注意:对于C 11和C 14,removeTrailZero是模板功能,可以接收std::array的不同大小。对于C 的较旧版本,11 removeTrailZero是用于接收int[23]的设计。