如何在不使用计数器的情况下检查数组的元素是否相同?

时间:2013-09-26 16:20:17

标签: c arrays comparison

假设我有一个数组

 bool string[N]={false};

执行某些操作后,数组字符串的所有元素都变为true。 我想在if语句中检查这种情况,如下所示: -

伪代码 -

if(all the elements of string are same or equal)
 then do this

我如何实现这一点?我不应该使用像

这样的计数器
for(int i=0;i<N;i++)   //or something else like this 

4 个答案:

答案 0 :(得分:5)

PP只需稍微改变他的代码,他所暗示的答案是: -

if (memcmp (&string [0], &string [1], sizeof string [0] * (N - 1)) == 0)
{
  /* all elements the same */
}

N-1停止超越缓冲区的末尾。

memcmp将字符串[0]与字符串[1]进行比较,然后将字符串[1]与字符串[2]进行比较,然后将字符串[2]与字符串[3]进行比较,依此类推,直至字符串[n-2]和字符串[N-1]。

答案 1 :(得分:0)

如果你可以使用指针,那么它可能是这样的:

bool first = string[0];
bool* current = string + 1;
bool* end = string + N;

bool allEqual = true;

while (current < end)
{
    if (*current != first)
    {
        allEqal = false;
        break;  // No need to loop more
    }

    ++current;
}

if (allEqual)
    std::cout << "All elements are " << std::boolalpha << first << '\n';
else
    std::cout << "First not-equal is at index " << (current - string) / sizeof(string[0]) << '\n';

与使用索引真的没什么不同,因为指针current充当一种索引。

答案 2 :(得分:0)

“我不应该使用像for(int i=0;i<N;i++)”这样的计数器〜&gt;你仍然需要编写一个检查所有元素的循环,你只需要避免使用临时int变量进行索引。

这是基于指针算法的可能解决方案之一:
int elementsAreEqual(int* first, int size) {
    int* current = first;
    int* last = first + size - 1;
    while (1) {
        if (*current != *first)
            return 0;
        if (current == last)
            break;
        current++;
    }
    return 1;
}
用作:
const int N = 5;
int values[] = {0,0,0,0,0};

if (elementsAreEqual(values, N))
    printf("Elements are equal.\n");
else
    printf("Elements are not equal.\n");

答案 3 :(得分:0)

如果您只想使用一个if和no循环进行检查,则可以尝试以下操作:

bool string[N] = {false};

if ((0 == memcmp(&string[0], &string[1], sizeof(string[0]) * (sizeof(string) - 1))) {
   //equal
}

因为两个存储区重叠,偏移一个,所以比较数组中的每一对。