Dmitry Makovetskiyd
Dmitry Makovetskiyd

Reputation: 7053

Need help with . string.substring(0, max.Length)

ArgumentOutofBounds Exceptions is thrown all the times inside the ifs in the loop.

In this code I am trying to send two strings between the symbol @2@3.

string1+"@2@3"+string2

Now I try to separate the strings from the symbols by the method substring, but an exception is being thrown over there......

public void seperatePMChattersNames(string TwoNames)
{
    string nameOne="";
    string nameTwo="";

    Console.WriteLine(TwoNames);
    for (int i = 0; i < TwoNames.Length; i++)
    {
        if (TwoNames[i] == '2' && TwoNames[i-1] == '@')///ArgumentOutofRange Exception
        {
                nameOne = TwoNames.Substring(0, i);
        }
        if (TwoNames[i] == '@' && TwoNames[i+1] == '3')///ArgumentOutofRange Exception
        {           
            nameTwo = TwoNames.Substring(i+1, TwoNames.Length);               
        }
    }
}

Why is it thrown and how to prevent it?

Upvotes: 0

Views: 2278

Answers (4)

Student
Student

Reputation: 3509

This is the answer

public void seperatePMChattersNames(string TwoNames)
        {
                Console.WriteLine(TwoNames);
                int x = TwoNames.IndexOf("@2");
                int y = TwoNames.IndexOf("@3");
                string nameone = TwoNames.Substring(0, x);
                string nametwo = TwoNames.Substring(y+2);
                Console.WriteLine(nameone);
                Console.WriteLine(nametwo);
        }

Upvotes: 0

Vivek Goel
Vivek Goel

Reputation: 24160

 for (int i = 0; i < TwoNames.Length; i++)

should be

 for (int i = 1; i < TwoNames.Length-1; i++)

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1502296

When i is zero, TwoNames[i - 1] will try to access index -1 of the string - that doesn't exist.

When i is TwoNames.Length - 1, TwoNames[i + 1] will try to access past the end of the string.

Next, when you have found "@3", you're using:

TwoNames.Substring(i+1, TwoNames.Length)

the second parameter of Substring is the length of the substring to take, not the final index. If you just want the rest of the string, you can omit the second argument:

TwoNames.Substring(i+1)

Note that that would include the "3" though - so you probably really want i+2 instead of i+1.

Is there any reason you're not using string.IndexOf(TwoNames, "@2") etc?

If you just want nameOne to be the string before the first "@2" and nameTwo to be the string after the last "@3", you can use:

int endOfOne = TwoNames.IndexOf("@2");
if (endOfOne != -1)
{
    nameOne = TwoNames.Substring(0, endOfOne);
}
else
{
    // Couldn't find @2... throw exception perhaps?
}

int startOfTwo = TwoNames.LastIndexOf("@3");
if (startOfTwo != -1)
{
    // Allow for the "@3" itself
    nameTwo = TwoNames.Substring(startOfTwo + 2);
}
else
{
    // Couldn't find @3... throw exception perhaps?
}

Another option is to use regular expressions, of course - they add a degree of complexity themselves, but they really are aimed at pattern matching. If you find you need to get even more bits and pieces, they could help.

Upvotes: 1

brent777
brent777

Reputation: 3379

Your loop starts with i = 0 but in your first if-statement you try access TwoNames[i-1] which tries to access TwoNames[-1]. Clearly this will cause an issue since there is no TwoName[-1].

Your loop should start with i = 1, not 0.

Upvotes: 1

Related Questions