2014-10-04 49 views
1

我想挑出一個字符串中的每個單詞,該單詞用大寫字母開頭,但在第3行出現數組越界錯誤;挑出以大寫字母開頭的每個單詞

foreach (string strWord in words) 
{ 
    if (Char.IsUpper(strWord[0]) && strWord.Length > 0) 
    { 
     Console.Write(strWord + " :: "); 
    } 
} 

謝謝您的幫助

+0

_ 「數組越界」 _?它實際上是一個「索引超出界限例外」嗎? – 2014-10-04 23:37:17

回答

4

交換的參數,否則它崩潰檢查:

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
2

只是做了strWord.Length > 0第一

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
{ 
    Console.Write(strWord + " :: "); 
} 

這樣你就可以確保strWord公頃在嘗試獲得第一個字母之前至少要寫一封信。

1

這裏發生的事情是,您首先檢查strWord [0]的值,而不先確認該單詞中是否有字母,因此在strWord的值爲NULL的情況下,程序將引發除非索引0被調用,雖然它沒有被賦予值,所以要糾正這個問題,你應該首先檢查這個字的長度,然後檢查字符strWord [0]是否爲大寫或者不是這種方式,如果字符串爲NULL,則如果條件將被丟棄它到達第二部分之前校正代碼1: -

if (strWord.Length > 0) 
{ 
    if(Char.IsUpper(strWord[0])) 
    { 
     Console.Write(strWord + " :: "); 
    } 
} 

校正代碼2: -

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
{ 
    Console.Write(strWord + " :: "); 
} 
1

確保在使用運算符& &時首先檢查長度,因爲參數是按順序評估的。如果第一個參數失敗,第二個將不執行,並且IsUpper造成的界外的錯誤時,長度爲0:

http://msdn.microsoft.com/en-us/library/2a723cdk.aspx

所以你只需要圍繞交換評價:

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
{ 
    //etc 
} 
1

&& - 操作員是一個短路操作員,該操作員只會在返回false時評估第一個條件。所以如果你想防止異常,這是正確的選擇。但是你必須使用正確的順序,首先檢查可能失敗的方法。

所以這樣的:

if (strWord.Length > 0 && Char.IsUpper(strWord[0])) 
... 

但是,您也可以使用這個整潔的LINQ查詢:

var allWordsThatStartWithUpperCaseLetters = words 
    .Where(w => w.Length > 0 && Char.IsUpper(w[0])); 
string result = string.Join(" :: ", allWordsThatStartWithUpperCaseLetters); 
相關問題