我得到了一个代码,该代码在具有至少3个不同元音的行中找到一个单词。问题是我不知道为什么会超出范围。
static string findword(string e)
{
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
char[] sk = { ' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t' };
string word= "";
string[] parts = e.Split(sk, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < e.Length; i++)
{
if (parts[i].IndexOf(vowels[i]) >= 3)
{
word = parts[i];
}
}
return word;
}
因此对于e = "I was going home today"
,它应该返回"today"
。
答案 0 :(得分:4)
i
从0到e.Length - 1
,但是您可以使用它来访问数组parts
,该数组的长度可以不同,也可以不一样。
答案 1 :(得分:2)
这是我的版本:
var e = "I was going home today";
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
char[] sk = { ' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t' };
string word = "";
string[] parts = e.Split(sk, StringSplitOptions.RemoveEmptyEntries);
var mostVowels = 0;
for (int i = 0; i < parts.Length; i++)
{
var part = parts[i];
var numberOfVowels = 0;
foreach (var vowel in vowels)
{
if (part.Contains(vowel)) numberOfVowels++;
}
if (mostVowels < numberOfVowels)
{
mostVowels = i;
word = part;
}
}
return(word);
它循环遍历各个部分,然后另一个循环检查该部分是否包含每个元音。然后检查这个词是否比先前的最好。
请注意,这将返回“ going”,因为它是带有两个元音的第一个单词。
还请注意,我使用了“ foreach”而不是普通的for循环,这有助于避免许多常见的错误。
此代码可能会更好,因为它只对每个元音查找一次。像“ Aardvark”这样的单词只能得到1分。毫无疑问,使用LINQ和正则表达式确实有一种非常简洁的方法,但是希望这可以帮助您了解循环和数组出了什么问题。
编辑:这是为您提供的regex和LINQ版本:
var r = new Regex("(a|e|i|o|u)");
var mostVowels = parts.Max(y => r.Matches(y).Count);
var result = parts.First(x => r.Matches(x).Count == mostVowels);
Regex是查找元音的助手。第一个查询计算出每个单词中的元音数量并返回最大值。第二个单词找到第一个带有这么多元音的单词。
答案 2 :(得分:0)
问题是
为什么它越界
(问题标题提出的问题与上下文完全不同,建议修正标题。)
然后答案很简单。正因为如此:
原因1:
for (int i = 0; i < e.Length; i++)
应该是:
for (int i = 0; i < parths.Length; i++)
原因2:
if (parts[i].IndexOf(vowels[i]) >= 3)
应该是:
if (CountVowels(parts[i]) >= 3)
不幸的是,CountVowels
函数超出了此问题的范围,并且由于它听起来像是一项家庭作业,因此您需要自行创建函数CountVowels
。