2013-09-26 84 views
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 
+0

指針還行嗎? –

+0

@JoachimPileborg是的,他們是。 – chanzerre

+0

'for(bool * p = string;(p-string)

回答

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

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充當一種索引。

+3

是不是C++而不是C代碼? – Mauren

+0

@Mauren:也許是因爲OP發佈的代碼也不是C。 – LihO

+1

@LihO我沒有注意到。聽起來很公平。 – Mauren

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"); 
0

如果你想只有一個,如果要檢查它,沒有循環,你可以嘗試以下方法:

bool string[N] = {false}; 

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

由於兩個存儲區域重疊,由一個偏移,則每對陣列中的相比較。

相關問題