我想挑出一個字符串中的每個單詞,該單詞用大寫字母開頭,但在第3行出現數組越界錯誤;挑出以大寫字母開頭的每個單詞
foreach (string strWord in words)
{
if (Char.IsUpper(strWord[0]) && strWord.Length > 0)
{
Console.Write(strWord + " :: ");
}
}
謝謝您的幫助
我想挑出一個字符串中的每個單詞,該單詞用大寫字母開頭,但在第3行出現數組越界錯誤;挑出以大寫字母開頭的每個單詞
foreach (string strWord in words)
{
if (Char.IsUpper(strWord[0]) && strWord.Length > 0)
{
Console.Write(strWord + " :: ");
}
}
謝謝您的幫助
交換的參數,否則它崩潰前檢查:
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
只是做了strWord.Length > 0
第一
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
Console.Write(strWord + " :: ");
}
這樣你就可以確保strWord
公頃在嘗試獲得第一個字母之前至少要寫一封信。
這裏發生的事情是,您首先檢查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 + " :: ");
}
確保在使用運算符& &時首先檢查長度,因爲參數是按順序評估的。如果第一個參數失敗,第二個將不執行,並且IsUpper造成的界外的錯誤時,長度爲0:
http://msdn.microsoft.com/en-us/library/2a723cdk.aspx
所以你只需要圍繞交換評價:
if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
//etc
}
&&
- 操作員是一個短路操作員,該操作員只會在返回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);
_ 「數組越界」 _?它實際上是一個「索引超出界限例外」嗎? – 2014-10-04 23:37:17