¿Como usar substring correctamente en c#?

publicado por: Anonymous

¡Buenas!

Estoy tratando de hacer el ahorcado en C# para afianzar mis conocimientos sobre el uso de Strings. Pero usando el metodo substring me dice que “se sale del indice”.

Os dejo el codigo:

static String changingHiddenWord(String hiddenWord) {
            String changed, firstPart, endPart;
            int len = secretWord.Length-1;
            for (int i=0;i<len;i++) {
                String stri = Char.ToString(secretWord[i]);
                if (stri == letter) {
                     changed = letter;

                     if (i > 0) {
                        firstPart = hiddenWord.Substring(0,(i*2)-1);
                        Console.WriteLine("firstPart: ", firstPart);
                     } else {
                        firstPart = "";
                    }
                    if (i > 0) {
                        endPart = hiddenWord.Substring((i*2)-1,len);
                    } else {
                        endPart = "";
                    }
                    hiddenWord = firstPart + changed + endPart;
                    }
             } return hiddenWord;
      }

os pongo en contexto:
hiddenWord tiene el formato “- – – – -”
letter es una letra minúscula
secretWord es una la palabra secreta que intento adivinar, en este caso “fuente”.

por tanto cuando introduzco la t hiddenWord deberia ser: “- – – – t -“

Este es el error

System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
at System.String.Substring (System.Int32 startIndex, System.Int32 length) [0x00076] in <8f2c484307284b51944a1a13a14c0266>:0
at ahorcado.ahorcado.changingHiddenWord (System.String hiddenWord) [0x00073] in <84dfe50e1577450cacf5ed8ac60b8b1d>:0

¡Gracias de antemano!

solución

Cuando llama Substring, el index y length debe referir a un posicion valido en la cadena. Significa que no debe ser mayor que la ultima indice en la cadena (cadena.Length - 1).
Una metoda para comprobar si el substring conseguir lo que intenta es depurar el codigo con un Console.WriteLine.

He revisado su codigo, y aqui es el codigo modificado con los errores coregido.
Puse hiddenWord, letter, y secretWord como argumentos de la funcion para que la funcion no accede variables fuera de si mismo.

static string changingHiddenWord(string hiddenWord, string letter, string secretWord)
{
    string changed, firstPart, endPart;

    int len = secretWord.Length;

    for (int i = 0; i < len; i++)
    {
        string stri = Char.ToString(secretWord[i]);

        if (stri == letter)
        {
            changed = letter;

            // firstPart
            if (i == 0)
            {
                firstPart = "";
            }
            else
            {
                firstPart = hiddenWord.Substring(0, i);    
            }

            Console.WriteLine("firstPart: " + firstPart);
            Console.WriteLine("changed: " + changed);


            // endPart
            if (i == (len - 1))
            {
                // si 'i' esta igual a la indice ultima
                endPart = "";
            }
            else
            {
                endPart = hiddenWord.Substring(i + 1, len - 1 - i);
                // Chequear cuales son los valores de los argumentos de Substring
                Console.WriteLine(String.Format("endPart => startIndex: {0}, length: {1}", i + 1, len - 1 - i));
            }

            Console.WriteLine("endPart: " + endPart);

            hiddenWord = firstPart + changed + endPart;
        }
    }

    return hiddenWord;
}

Puede llamar la funcion como esto:

string resultado = changingHiddenWord("------", "t", "fuente");
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *