Wątek przeniesiony 2015-12-29 12:35 z C# i .NET przez somekind.

IndexOutOfRangeException, błąd przy zbyt małej ilości znaków.

0

Dzień dobry,
Chcę stworzyć program w którym będą wpisywane od 1 do 3 znaków (cyfry oraz znak "-"). Tu właśnie pojawia się problem, gdyż istnieją 2 możliwości które zakłócą działanie programu, a mianowicie: 1) użytkownik poda sam znak "-"; 2) użytkownik wstawi znak "-" jako drugi bądź trzeci znak w przypadku ciągu dłuższego niż 1 znak.

private void button1_Click(object sender, EventArgs e)
        {
            string napis = textBox1.Text;
            char[] abc = new char[napis.Length];
            abc = napis.ToCharArray();
            int rozmiar = napis.Length;
            if (abc[0] == '-' && rozmiar == 1) { textBox2.Text = "zle"; }
            else
            {
                if (abc[1] == '-' && rozmiar == 2) { textBox2.Text = "zle"; }
                else
                {
                    if ((abc[1] == '-' || abc[2] == '-') && rozmiar == 3) { textBox2.Text = "zle"; }

                        else { textBox2.Text = "dobrze"; }

                }
            }
        }

Błąd pojawia się w przypadku wpisania ciągu krótszego niż trzy znaki, jest on opisany jako 'IndexOutOfRangeException'. Niestety nie mam pomysłu jak to naprawić i byłbym bardzo wdzięczny za pomoc. Wydaje mi się, że problem leży po stronie komendy .Length (a właściwie to po mojej niewiedzy). Z góry dziękuję za odpowiedź oraz pozdrawiam serdecznie.

0

Nie możesz wykorzystać do tego wyrażeń regularnych?
No i ten... formatuj normalnie kod.

PS możesz także podejść do tego na odwrót - założyć, że użytkownik wpisał zły ciąg znaków i wyświetlić dobrze tylko wtedy, jeśli wszystko jest ok. To powinno skrócić kod do pojedynczej instrukcji warunkowej. Nie wspominając oczywiście o tym, że sama walidacja powinna być wydzielona do odrębnej metody.

2

jestem niemalże całkowicie zielony jeśli chodzi o programowanie

Ano, to trzeba było założyć wątek w dziale newbie :P

Tak czy siak, skoro jesteś zielony, to wyrażenia regularne nie będą rozwiązaniem (przy okazji - Google Twoim przyjacielem). Na oko coś takiego się sprawdzi:

private static bool validateCośtamJakToNazywasz(string input) {
    // pierwszy warunek: na pewno ciąg musi mieć trzy znaki
    if (input.Length != 3) {
        return false;
    }

    // drugi warunek: środkowy znak musi być cyfrą
    // to już Ty zrób ;)
}

private void button1_Click(object sender, EventArgs e) {
    string text = textBox1.Text;

    if (TwojaKlasa.validateCośtamJakToNazywasz(textBox1.Text)) {
        textBox2.text = "dobrze";
    } else {
        textBox2.Text = "zle";
    }
}

Zauważ wydzielenie kodu walidatora do osobnej metody statycznej (ponieważ to jest uniwersalny kod).

0
private static bool blad(string input)
        {
            char[] abc = new char[input.Length];
            abc = input.ToCharArray();
            if (input.Length != 3)
            {
                if (input.Length != 2)
                {
                    if (input.Length != 1)
                    {
                        return false;
                    }
                    else
                    {
                        if (abc[0] == '-')
                        {
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }
                }
                else
                {
                    if (abc[1] == '-')
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
            }
            else
            {
                if (abc[1] == '-' || abc[2] == '-')
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string text = textBox1.Text;
            if (Form1.blad(textBox1.Text))
            {
                textBox2.Text = "dobrze";
            }
            else
            {
                textBox2.Text = "zle";
            }
        }

Wszystko dobrze działa, może się komuś przyda, podziękowania dla kolegi wyżej! :)

0

Oh my...

 if (abc[1] == '-')
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }

Przynajmniej to poskracaj do:

return (abc[1] != '-');

(zauważ zmianę operatora)

2

private static bool blad(string input)
{
char[] abc = new char[input.Length];
abc = input.ToCharArray();
if (input.Length != 3)
{
if (input.Length != 2)
{
if (input.Length != 1)
{
return false;
}
else
{
if (abc[0] == '-')
{
return false;
}
else
{
return true;
}
}
}
else
{
if (abc[1] == '-')
{
return false;
}
else
{
return true;
}
}
}
else
{
if (abc[1] == '-' || abc[2] == '-')
{
return false;
}
else
{
return true;
}
}
}
    private void button1_Click(object sender, EventArgs e)
    {
        string text = textBox1.Text;
        if (Form1.blad(textBox1.Text))
        {
            textBox2.Text = "dobrze";
        }
        else
        {
            textBox2.Text = "zle";
        }
    }

To można "trochę" uprościć. Sposobów jest wiele, ale na przykład tak:

```csharp
private static bool blad(string input)
{
    if (input.Length == 3)
        return input[1] != '-' && input[2] != '-';

    if (input.Length == 2)
        return input[1] != '-';

    if (input.Length == 1)
        return input[0] != '-';

    return false;
}

private void button1_Click(object sender, EventArgs e)
{
    textBox2.Text = Form1.blad(textBox1.Text) ? "dobrze" : "zle";
}

I od razu widać co się dzieje.

(Jeszcze zmieniłbym nazwę "blad" na "validate" albo chociaż "ok" - bo nazwa sugeruje że funkcja sprawdza czy jest błąd, a tak naprawdę sprawdza czy błędu nie ma)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0