2016-09-25 24 views
1

我試圖創建一個應該做以下的功能:如果聲明未能激活

-Take兩個字符數組,一個比另一個更小,並確定小字符數組是否是一個子集的較大陣列。作爲示例: 陣列A:{"s","c","h","o","o","l"};陣列B:{"c","h"}。我有義務使用指針增加/減少操作。這是我所生成的代碼:

int locator(char *Bigptr, char *Smallptr) { 
int count = 0; 
    for (; *Bigptr != '\0'; Bigptr++) { 
     if (*Smallptr == *Bigptr) { 
      for (; (*Smallptr == *Bigptr) != '\0'; Smallptr++, Bigptr++) {} 
      if (*Smallptr == '\0') { 
       return count; 
      } 
      else { 
       cout << "small is not the subset of big" << endl; 
       return 0; 
      } 
     } 
     count++; 
    } 
return 0; 

這是我如何看待的代碼應該運行:

兩個指針到一個字符數組被作爲參數的函數「定位」。變量計數是我爲了告訴我A中出現的第一個字符的下標是什麼(例如,「school」和「ch」將是元素1,所以A [1])。第一個for循環確保較大數組的第一個值是一個實際的字符。 if語句在找到一個共同的字符時返回true。第二個for循環然後檢查是否所有較小的數組都存在於較大的數組中。當我的程序編譯時,所有這些都按預期工作。問題出現在嵌套的if語句中。實際上,如果更小的陣列是較大陣列的一個子集,我預計它是真實的。爲什麼不是這種情況?以「學校」和「通道」爲例。 * Smallptr最初指向數組B的第一個元素(即「ch」),所以「c」。然後將其與「學校」中的「c」進行比較。這兩個指針然後遞增,以便它們都指向它們各自陣列中的「h」。再次,它們再次遞增,以使Bigptr指向「o」,Smallptr指向「\ 0」。情況並非如此嗎?爲什麼函數總是輸出else語句?

+1

你的參數是字符數組的數組,而不是char數組。你需要提供一個完整的例子。 – doug

+0

當我運行它時,它返回計數,其中count == 1。我可能通過傳遞正確的數據類型來搞砸了。你和A的聲明聽起來不對。 –

回答

-1

你有一些錯誤。 看看這個返工:

int locator(char *Bigptr, char *Smallptr) { 
    int count = 0; 
    for (; *Bigptr != '\0'; Bigptr++) { 
     if (*Smallptr == *Bigptr) { 
      for (; *Smallptr == *Bigptr && *Bigptr!='\0'; Smallptr++, Bigptr++) { 
       count++; 
      } 
      if (*Smallptr == '\0') { 
       return count; 
      } 
      break; //this is necesary in order not to stay in the main for loop 
     } 
    } 
    std::cout << "small is not the subset of big" << std::endl; 

    return count; 
} 

編輯:測試在主函數的代碼和它完美的作品:

​​
+0

我真的不明白你爲什麼投下了這個和@R Sahu的回答如下... –

+0

嘿何塞,我沒有能力投票或者因爲我是新成員,因此它沒有投票權,我。但是,我確實嘗試了您的代碼,問題依然存在。所以,這可能是另一個人低估了你的評論的原因。 – Ennis

+0

你說得對。我錯過了一次「休息」。此外,我認爲返回計數總是更有趣。所以用戶總是可以獲得匹配字符的數量。現在代碼已經過測試,它確實做了它應該做的事情。 –

-1

在該行所使用的邏輯

for (; (*Smallptr == *Bigptr) != '\0'; Smallptr++, Bigptr++) {} 

是不正確。

你需要的是:

for (; (*Smallptr == *Bigptr) && *SmallPtr != '\0'; Smallptr++, Bigptr++) 
{ 
    ++count; 
} 
2

你的第二for循環的理解不正確。

if (*Smallptr == *Bigptr) { 
    for (; (*Smallptr == *Bigptr) != '\0'; Smallptr++, Bigptr++) {} 

既然你已經確定(在if條件語句)是*Smallptr == *Bigptr,是比較給出一個非零(true)結果。

測試(*Smallptr == *Bigptr) != '\0'將該非零結果與值爲零的char進行比較。非零值永遠不會比較爲零(至少不能與標準整數類型,包括bool),因此循環無效。

阿與說明書一致環是

for (; (*Smallptr == *Bigptr) && *SmallPtr != '\0'; Smallptr++, Bigptr++) {} 

該檢查,如果兩個字符彼此相等,並且兩個非零的。

+0

感謝您的回覆,我明白了您的觀點,但我有幾次跟進。首先,你提到循環沒有效果。那是什麼意思?我使用我的原始代碼創建了一個虛擬變量,以查看循環是否正常工作,並確實「循環」。而且,即使在測試了您的建議之後,for循環之後的if語句仍然是錯誤的。爲什麼會是這種情況?不應該改善你的建議,然後確保* Smallptr確實'指向''0'。再次感謝您的回覆,我非常感謝。 – Ennis

+0

您的'for'語句的結束條件在達到之前爲true。因此,循環體(在你的情況下,什麼都不做)和延續語句(在你的情況下,Smallptr ++,Bigptr ++)都不會被執行。正如我描述的那樣,如果'* SmallPtr!= * BigPtr'或'* SmallPtr'爲零,循環將會停止。如果這不符合您的要求,請修改以適應。 – Peter

1

鑑於這是C++,您可能希望利用標準庫中已有的功能。我願意做這個命令的東西:

bool is_subset(std::string big, std::string small) { 

    std::sort(big.begin(), big.end()); 
    std::sort(small.begin(), small.end()); 

    std::string result; 
    std::set_difference(small.begin(), small.end(), 
         big.begin(), big.end(), 
         std::back_inserter(result)); 
    return result.empty(); 
} 

這不符合有關使用指針的要求,但IMO這是一個更好的辦法來完成這項工作。