索引超出了数组c#,morse转换器的界限

索引超出了数组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

我试图构建一个莫尔斯转换器,下面是我的c#代码的一部分,但当我运行它时,它告诉我索引超出了界限,有人能修复它吗?我是编程新手:)

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);
}