挑出以大写字母开头的每个单词
问题描述:
我想挑出一个字符串中的每个单词,该单词用大写字母开头,但在第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