0

假设我有一个数组

 bool string[N]={false};

执行一些操作后,数组字符串的所有元素都变为真。我想在 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

4 回答 4

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]。

于 2013-09-26T16:44:21.407 回答
0

如果您只想使用一个 if 循环而不是循环来检查它,您可以尝试以下操作:

bool string[N] = {false};

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

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

于 2013-09-26T17:16:12.883 回答
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充当一种索引。

于 2013-09-26T16:43:31.070 回答
0

“我不应该使用像for(int i=0;i<N;i++) ~> 这样的计数器,您仍然需要编写一个检查所有元素的循环,您只需要避免使用临时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");
于 2013-09-26T16:43:41.670 回答