索引超出了数组c#,morse转换器的界限
我试图构建一个莫尔斯转换器,下面是我的c#代码的一部分,但当我运行它时,它告诉我索引超出了界限,有人能修复它吗?我是编程新手:)索引超出了数组c#,morse转换器的界限,c#,converter,morse-code,C#,Converter,Morse Code,我试图构建一个莫尔斯转换器,下面是我的c#代码的一部分,但当我运行它时,它告诉我索引超出了界限,有人能修复它吗?我是编程新手:) private void BTNconvert\u单击(对象发送者,事件参数e) { 字符串输入=TBinput.Text; string[]输出=新字符串[input.Length]; 对于(int index=0;index您看到此错误的原因是,如果在字符串中找不到给定的搜索项,则IndexOf()将返回一个-1值,因此当您尝试设置输出[-1
private void BTNconvert\u单击(对象发送者,事件参数e)
{
字符串输入=TBinput.Text;
string[]输出=新字符串[input.Length];
对于(int index=0;index您看到此错误的原因是,如果在字符串中找不到给定的搜索项,则IndexOf()
将返回一个-1
值,因此当您尝试设置输出[-1]
时,您将得到一个无效的索引
private void BTNconvert_Click(object sender, EventArgs e)
{
int index;
string input = TBinput.Text;
string[] output=new string[input.Length];
index = -1;
do{
index=input.IndexOf('a',index+1);
if(index==-1)break;
output[index]=".-";
}while(true);
index = -1;
do{
index=input.IndexOf('b',index+1);
if(index==-1)break;
output[index]="-...";
}while(true);
}
LBcodes.Text = string.Join(" ",output);
此外,如果要对所有字符进行这些循环,我建议您这样做:
private void BTNconvert_Click(object sender, EventArgs e)
{
int index;
char[] source1 = {'a','b','c',....,'z'} //replace ... with characters
string[] source2 = {".-","-...",....} //replace .... with Morse equivalents
string input = TBinput.Text;
string[] output=new string[input.Length];
for(int i=0;i<26;i++){
index = -1;
do{
index=input.IndexOf(source1[i],index+1);
if(index==-1)break;
output[index]=source2[i];
}while(true);
}
}
LBcodes.Text = string.Join(" ",output);
private void BTNconvert\u单击(对象发送者,事件参数e)
{
整数指数;
char[]source1={'a','b','c',…,'z'}//将…替换为字符
字符串[]source2={“-”,“-…”,…}//用莫尔斯等价物替换
字符串输入=TBinput.Text;
string[]输出=新字符串[input.Length];
对于(inti=0;i如果是我,我会保留每个字符及其对应的莫尔斯字符串的字典映射。这将使来回转换变得容易
例如:
private static Dictionary<char, string> MorseMap = new Dictionary<char, string>
{
{'A', ".-"}, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."},
{'E', "."}, {'F', "..-."}, {'G', "--."}, {'H', "...."},
{'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."},
{'M', "--"}, {'N', "-."}, {'O', "---"}, {'P', ".--."},
{'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"},
{'U', "..-"}, {'V', "...-"}, {'W', ".--"}, {'X', "-..-"},
{'Y', "-.--"}, {'Z', "--.."},{'1', ".----"}, {'2', "..---"},
{'3', "...--"}, {'4', "....-"},{'5', "....."}, {'6', "-...."},
{'7', "--..."}, {'8', "---.."},{'9', "----."}, {'0', "-----"},
{'.', ".-.-.-"}, {',', "--..--"},{'?', "..--.."}, {'\'', ".----."},
{'!', "-.-.--"}, {'/', "-..-."},{'(', "-.--."}, {')', "-.--.-"},
{'&', ".-..."}, {':', "---..."},{';', "-.-.-."}, {'=', "-...-"},
{'+', ".-.-."}, {'-', "-....-"},{'_', "..--.-"}, {'"', ".-..-."},
{'$', "...-..-"}, {'@', ".--.-."}
};
用法示例:
private static void Main()
{
var test = "This is my test string.";
var morseVersion = ConvertToMorse(test);
var alphaVersion = ConvertToAlpha(morseVersion);
Console.WriteLine("Original string ... {0}", test);
Console.WriteLine("Morse version ..... {0}", morseVersion);
Console.WriteLine("Alpha version ..... {0}", alphaVersion);
}
如果在输入字符串中找不到指定的文本,IndexOf()将返回-1。只有在文本框中输入指定的字符,代码才能正常工作。这就是删除第二个循环并在文本框中输入所有a时代码正常工作的原因
除此之外,您还需要使用2个循环。您在两个循环中都做了相同的事情。索引是基于零的。您应该迭代到input.Lenght-1.Well。我想通过这种方式,我可以在第一个元素处搜索原始字符串。@user18044:他正在检查它是否小于(你能给我解释一下吗?Thanks@RobbieNirvanaLiu看看我的答案,我想它会解决你的问题;这可能是它不起作用的一个原因。我试着键入一个只有a和b的字符串,它也不起作用,同样的错误也会发生,如果我去掉搜索“b”的第二个for循环,而我只键入“a”,它就会起作用谢谢,我想现在我了解了我的代码,我试着键入一个只有a和b的字符串,它也不起作用,同样的错误也会发生,如果我去掉搜索“b”的第二个for循环,我只键入“a”,它就起作用了。我是堆栈流新手,我检查了答案左边的按钮,是否标记了?@RobbieNirvanaLiu是的。检查秒在我的部分答案中,我认为它会对你有更大的帮助。我正在阅读它,我认为它也解决了我未来的问题,我正在考虑调用一种方法,但我认为这种方法效果更好。谢谢!
private static string ConvertToMorse(string input)
{
var morse = new StringBuilder();
foreach (var character in input)
{
var upperCaseChar = char.ToUpper(character);
if (MorseMap.ContainsKey(upperCaseChar))
{
morse.Append(MorseMap[upperCaseChar]);
}
else
{
// If there's no mapping for this character, just add it
morse.Append(character);
}
// Add a space between each morse string.
morse.Append(' ');
}
return morse.ToString().Trim();
}
private static string ConvertToAlpha(string morse)
{
var alpha = new StringBuilder();
// Split words on double-spaces so we can add single spaces back where needed
var morseCodeWords = morse.Split(new[] {" "}, StringSplitOptions.None);
foreach (var morseCodeWord in morseCodeWords)
{
var morseCodeStrings = morseCodeWord.Split(' ');
foreach (var morseCodeString in morseCodeStrings)
{
if (MorseMap.ContainsValue(morseCodeString))
{
alpha.Append(MorseMap.First(item => item.Value == morseCodeString).Key);
}
else
{
// If there's no mapping for the string, just add it
alpha.Append(morseCodeString);
}
}
// Add a space between each word
alpha.Append(' ');
}
return alpha.ToString();
}
private static void Main()
{
var test = "This is my test string.";
var morseVersion = ConvertToMorse(test);
var alphaVersion = ConvertToAlpha(morseVersion);
Console.WriteLine("Original string ... {0}", test);
Console.WriteLine("Morse version ..... {0}", morseVersion);
Console.WriteLine("Alpha version ..... {0}", alphaVersion);
}