字符串程序的范围
本文关键字:范围 程序 字符串 | 更新日期: 2023-09-27 18:29:11
这是一个程序,用于获取指定范围内字符串中的所有字母(在本例中为单词"袋鼠"的第3到7个字符)。
为什么我在arr[i] = x[start+i];
行出现错误?
我不使用Substring,因为我的教练希望我们弄清楚如何在没有它作为练习的情况下完成它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MethodsPractice2
{
class Program
{
static char[] GetRangeOfCharacters(string word, int start, int end)
{
string x = word;
char[] arr = new char[end - start];
for (int i = 0; i < end; i++)
{
arr[i] = x[start + i];
}
return arr;
}
private static void Main(string[] args)
{
char[] endResult;
string word = "kangaroo";
int start = 3;
int end = 7;
endResult = GetRangeOfCharacters(word, start, end);
Console.WriteLine(endResult);
}
}
}
我将解释您遇到的错误,
您已经说过,您希望从字符3开始,并用从(3)
+i
开始的字符填充有4个条目的arr
i
可以是小于7
的任何数字。。3+6=9;并且Kangaroo
中有8个字母…因此,对于循环,您至少需要转到
i < (end - start)
另一个错误可能是i>=4,在这种情况下,它将试图访问arr[4]
,这也超出了的范围
0123456789
kangaroo
garo## /// what arr would be - # = error
garoo# // where i would get you - # = error
如果您正在寻找打印部分字符串的最简单方法,如注释中所述,最简单的方法是使用String.Substring
方法。。要获得单词kangaroo
的3-7个字符,可以使用:
String.Substring(2,5);
2是起始索引(基于0,因此2是第三个字符),5是长度。
如果您需要字符数组(正如您的返回类型所示),您可以尝试使用String.ToCharArray
方法,该方法的功能与相同
x.ToCharArray(2,5)
因为循环中的字符太多:
static char[] GetRangeOfCharacters(string word, int start, int end)
{
string x = word;
char[] arr = new char[end - start];
for (int i = 0; i < end; i++) // <--- here!!!
{
arr[i] = x[start + i];
}
return arr;
}
正确的是
for (int i = 0; i < end - start; i++)
我会使用这个(跳过无效参数检查):
static char[] GetRangeOfCharacters(string word, int start, int end)
{
return word.Skip(start).Take(end - start).ToArray();
// or more efficient: word.Substring(start, end - start).ToCharArray();
}
end是7,所以你从0到7循环,所以下标是3到10所以
for (int i = 0; i < end; i++)
应该是
for (int i = 0; i < (end - start); i++)
或者更清晰的
for (int i = 0; i < arr.Length; i++)
您的数组arr[]溢出1。Quantity(结束-开始)让你比你的范围小一个。
您需要使用数量(结束-开始+1)来调整目标数组的大小。
arr
是一个有4个插槽(7-3)的数组。
但代码:
for (int i = 0; i < end; i++)
将循环7次(因为end
==7),尝试在每次迭代时写入arr
的新位置。
Q: 如何将7个不同的值存储到只有4个插槽的数组中?
A: 你不能!
(for循环需要不同的约束)。
井的终点是7,起点是3。3+6是9。Kangaroo的长度只有8,所以你会得到一个超出范围的索引异常(在i<结束时循环,然后加上i开始得到索引)。正如其他人建议的那样,您应该使用子字符串而不是当前的方法。
string subString;
if (end - start < 0)
subString = null; // error!
else
subString = myWord.SubString(start, end - start);
可能还想检查开始和结束是否都小于myWord.Length