10 svar
66 visningar
CsharpStudent är nöjd med hjälpen
CsharpStudent 30
Postad: 18 dec 2021 00:02

Min TryParse fungerar endast delvis

Kan någon hjälpa mig förstå varför TryParse inte fungerar om användare skriver mindre tal, tex. 10, 6. Den fungerar om användaren skriver en text eller större tal.


            //Deklarerar en lista innehållande array
            //Initiering av array som innehåller 3 element
            List<String[]> MinBlogg = new List<String[]>(); 
            
            
            
            //Deklarerar en bool som är true
            bool IsRunning = true;

            
            //Vill bara att text ska skrivas ut en gång och sätter den utanför loop
            //n för ny rad, t för tabb
            Console.WriteLine("\n\tVälkommen! ");
           
            //Deklarerar en int för menyval
            int MenyVal;

            //SÅ LÄNGE bool är true kommer while loop fortsätta
            while (IsRunning)
            {

                //n för ny rad, t för tabb
                //Den här texten skrivs ut som menyval
                Console.WriteLine("\n\tGör ett val 1-5: ");
                Console.WriteLine("\n\t[1]Skapa ett inlägg");
                Console.WriteLine("\t[2]Visa sparade inlägg");
                Console.WriteLine("\t[3]Sök bland inlägg");
                Console.WriteLine("\t[4]Radera inlägg");
                Console.WriteLine("\t[5]Avsluta programmet");

                //Deklarerar en if
                //TryParse för att program ej ska krascha. TryParse returnerar true om TryParse lyckas
                if (Int32.TryParse(Console.ReadLine(), out MenyVal))

                    //VARFÖR TAR INTE TRYPARSE MINDRE TAL? TEX 35 99 86 OSV.DEN TAR STORA TAL OCH TEXT!TEX 972804826852805 ELLER HEJSAN
                {
                
                }

                else
                {
                    //ANNARS om TryParse inte lyckas, skriver programmet ut text nedan
                    Console.WriteLine("\tNågon blev fel! Vänligen skriv en siffra 1-5");
                }
                //Deklarerar en switch för menyVal
                switch (MenyVal)
                {
                    case 1:
                        //Skapar en strängvektor för inlägg, 3 platser element för: titel, inlägg, datum och tid
                        String[] Inlägg = new String[3];
                        //Skapar array/vektor för varje inlägg
                        //Sparar titel i index 0 (första elementet)
                        Console.Write("\tAnge en titel för ditt inlägg: ");
                        Inlägg[0] = Console.ReadLine();

                        //sparar inlägget i index 1 (andra elementet)
                        Console.WriteLine("Skriv ditt inlägg:");
                        Inlägg[1] = Console.ReadLine();

                        
                        //sparar tiden i index 2 (tredje elementet)
                        Inlägg[2] = DateTime.Now.ToString();

                        //Sparar inlägg i MinBlogg
                        //Skriver ut att inlägget är sparat
                        MinBlogg.Add(Inlägg);
                        Console.WriteLine("Ditt inlägg är nu sparat!");
                        
                        break;


        }
    }
}
Laguna Online 17496
Postad: 18 dec 2021 17:10

Visa en körning.

CsharpStudent 30
Postad: 18 dec 2021 22:50 Redigerad: 18 dec 2021 22:52

Alltså när jag kör programmet och skriver en bokstav eller väldigt stora siffror så fungerar det. Det fungerar ej om jag skriver tex. 10


        Välkommen!

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet
10

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet




111111

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet
111111111

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet
111111111111111111
        Någon blev fel! Vänligen skriv en siffra 1-5

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet





 Välkommen!

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet
hej
        Någon blev fel! Vänligen skriv en siffra 1-5

        Gör ett val 1-5:

        [1]Skapa ett inlägg
        [2]Visa sparade inlägg
        [3]Sök bland inlägg
        [4]Radera inlägg
        [5]Avsluta programmet
Programmeraren 2191
Postad: 19 dec 2021 09:12 Redigerad: 19 dec 2021 09:13

Att det går fel om du matar in en sträng eller ett större tal än int32 tyder på att TryParse körs med din input.
Du behöver hitta varför MenyVal inte får något värde, De flesta fel är svåra att hitta genom inspektion av kod.

Skriv ut alla inblandade variabler. Bryt ut Console.Readline(), ungefär så här:
String line = Console.ReadLine();
// skriv ut line
boolean ok = Int32.TryParse(Console.ReadLine(), out MenyVal));
// skriv ut ok och MenyVal
// sen kan din if för utskrift använda variabeln ok.

Laguna Online 17496
Postad: 19 dec 2021 09:23

Det torde fungera om du matar in ett tal som koden nedanför ska ta hand om, 1 till 5. Du menar tydligen att felrapporteringen för andra tal inte är bra.

TryParse läser in ett tal och sedan finns det talet inte med i 'switch', så då händer ingenting. Det är precis det vi ser. Du kan lägga till ett fall som fångar allt annat än det som anges tidigare i switchen, med "default:".

CsharpStudent 30
Postad: 20 dec 2021 09:52
Programmeraren skrev:

Att det går fel om du matar in en sträng eller ett större tal än int32 tyder på att TryParse körs med din input.
Du behöver hitta varför MenyVal inte får något värde, De flesta fel är svåra att hitta genom inspektion av kod.

Skriv ut alla inblandade variabler. Bryt ut Console.Readline(), ungefär så här:
String line = Console.ReadLine();
// skriv ut line
boolean ok = Int32.TryParse(Console.ReadLine(), out MenyVal));
// skriv ut ok och MenyVal
// sen kan din if för utskrift använda variabeln ok.

Jag testade detta men då fungerar inte menysiffrorna alltså 1-5. 

Programmeraren 2191
Postad: 20 dec 2021 09:58 Redigerad: 20 dec 2021 10:01

Visa koden + en körning så vi ser utskrifterna.

I din andra tråd verkar det som att allt fungerar så kanske inget problem?

Laguna Online 17496
Postad: 20 dec 2021 10:02
Programmeraren skrev:

Att det går fel om du matar in en sträng eller ett större tal än int32 tyder på att TryParse körs med din input.
Du behöver hitta varför MenyVal inte får något värde, De flesta fel är svåra att hitta genom inspektion av kod.

Skriv ut alla inblandade variabler. Bryt ut Console.Readline(), ungefär så här:
String line = Console.ReadLine();
// skriv ut line
boolean ok = Int32.TryParse(Console.ReadLine(), out MenyVal));
// skriv ut ok och MenyVal
// sen kan din if för utskrift använda variabeln ok.

Det ska väl vara så här?

boolean ok = Int32.TryParse(line, out MenyVal));

Programmeraren 2191
Postad: 20 dec 2021 10:17
Laguna skrev:

Det ska väl vara så här?

boolean ok = Int32.TryParse(line, out MenyVal));

Absolut!!!

CsharpStudent 30
Postad: 20 dec 2021 10:27
Programmeraren skrev:
Laguna skrev:

Det ska väl vara så här?

boolean ok = Int32.TryParse(line, out MenyVal));

Absolut!!!

Fick det tillslut äntligen att fungera med en default. Har testat så många sätt nu så jag är helt snurrig. Tack för all hjälp.

 

int menyVal;
Int32.TryParse(Console.ReadLine(), out menyVal);


{

}
//Deklarerar en else som exekveras om TryParse ej lyckas.
// else
{
//ANNARS om TryParse inte lyckas, skriver programmet ut information nedan till användaren.
// Console.WriteLine("\tNågon blev fel! Vänligen skriv en siffra 1-5");
}
//Deklarerar en switch för menyVal.
switch (menyVal)
{
case 1:
/*1.Skapar en case 1: start på första kodblocket i switchen
2.Initiering av strängvektor med 3 element, platser för: titel, inlägg, datum / tid.
3.Deklarerar strängvektorn efter whileloop för att jag vill att användare ska kunna spara flera inlägg,utan att det gamla inlägget skrivs över. Array loopas.
4.Skriver ut instruktion till användare.
5.Sparar titel i index 0 (första elementet) */
String[] Inlägg = new String[3];
Console.Write("\tAnge en titel för ditt inlägg: ");
Inlägg[0] = Console.ReadLine();

//1.Skriver ut instruktion till användare
//2.Sparar inlägget i index 1 (andra elementet)
Console.WriteLine("Skriv ditt inlägg:");
Inlägg[1] = Console.ReadLine();

//1.Sparar datum/tid i index 2 (tredje elementet)
Inlägg[2] = DateTime.Now.ToString();

/*1.Sparar titel,inlägg,tid i minBlogg med Addmetoden
2.Skriver ut information till användaren
3.break; Slut på detta kodblock*/
minBlogg.Add(Inlägg);
Console.WriteLine("Ditt inlägg är nu sparat!");

break;

case 2:
/*1.Skapar en case 2: start på andra kodblocket i switchen
*2.Skriver ut information till användaren.
3.Console.WriteLine(----); Gör det mer överskådligt att läsa inläggen.
Nedan är dina skrivna inlägg
----------------------
Datum/Tid: Titel: Inlägg
4.Foreach går igenom alla sparade inlägg i minBlogg*/
Console.WriteLine("\n Dina inlägg: \n");
Console.WriteLine("\n\t-------------------\n\t");
foreach (string[] dittInlägg in minBlogg)

/*1.Skriver ut alla arrays: Datum/Tid: Titel: Inlägg: Lagt array 2 först eftersom jag vill ha ut datum och klockslag först.
2.break; Avslutar detta kodblock */
Console.WriteLine("\n Puplicerat: " + dittInlägg[2] + " \n Titel - " + dittInlägg[0] + " \n Inlägg - " + dittInlägg[1] + "\n");

break;


case 3:



break;


case 4:
//Raderar alla inlägg
minBlogg.Clear();
Console.WriteLine("\nAlla inlägg är nu rensade.");

break;

case 5:
/*1.Skriver ut information
*/
Console.WriteLine("Välkommen tillbaka!");
Thread.Sleep(1000);
isRunning = false;

break;


default:
Console.WriteLine("Du kan bara välja mellan 1 och 5!");
Console.ReadLine();
break;
}
}

CsharpStudent 30
Postad: 20 dec 2021 10:28
Laguna skrev:

Det torde fungera om du matar in ett tal som koden nedanför ska ta hand om, 1 till 5. Du menar tydligen att felrapporteringen för andra tal inte är bra.

TryParse läser in ett tal och sedan finns det talet inte med i 'switch', så då händer ingenting. Det är precis det vi ser. Du kan lägga till ett fall som fångar allt annat än det som anges tidigare i switchen, med "default:".

Tack för hjälpen. Jag fick det att fungera med en default äntligen.

Svara Avbryt
Close