Tekst inn og ut fra terminal

Her kommer en innføring i hvordan man behandler tekst i terminalen.

Først og fremst skriver man tekst ut, og dette er omtrent som i andre programmeringsspråk:

string navn = "Ove Bakken";
Console.WriteLine("Hei, " + navn + "!");
Console.Write("Hei, " + navn + "!\n");
Console.WriteLine("Hei, {0}!", navn);
Console.Write("Hei, {0}!\n", navn);
// Gir alle det samme resultatet:
// 'Hei, Ove Bakken!'
// Hvor \n gir ny linje

Men noen ganger trenger man også å få tekst inn:

string passord = Console.ReadLine();
// Her kan man skrive hva man vil, for å avslutte trykker man på 'Enter'

string tegn = Console.Read();
// Leser kun enkeltbokstaver eller sammenhengende tekst
// Det vil si, den stopper der det er mellomrom, eller hvis 'Enter' trykkes

Console.Write("Passord: ");
string passord = Console.ReadLine();
// Skriver ut 'Passord: ' uten å starte ny linje,
// også kommer indikatoren hvor man begynner å skrive rett etter
// Med tekst fremfor vet bruker hva som forventes

Det er også vanlig å kunne oppgi informasjon ved oppstart.

For eksempel:

mittprogram.exe -auto -100
mittprogram -auto -100
mittprogram -styrke=100
o.s.v.

.. som så må tas tak i og behandles når programmet starter:

static void Main(string[] argumenter)
{
   foreach (string argument in argumenter)
   {
      // gjør et eller annet med argument
   }

   // eller:

   for (int s = 0; s < argumenter.Length; s++)
   {
      // gjør et eller annet med argumenter[s]
   }

   // Environment.GetCommandLineArgs() kan også brukes
   // i stedet for string[] argumenter man får fra Main
}

Man står fritt til å gjøre som man vil – det finnes ikke noe riktig og galt svar.

Et fullstendig eksempel, med innlesing av et argument gitt ved start, innlesing av tekst som bruker skriver inn, samt tekst som skrives ut igjen:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DNBinnlogging
{
   class Program
   {
      // Viser DNB-logoen som ASCII-kunst
      private static void visLogo()
      {
         Console.WriteLine("                    '");
         Console.WriteLine("                    '");
         Console.WriteLine("                    '");
         Console.WriteLine("                    '");
         Console.WriteLine(" '''''''    ',      '    '''''';");
         Console.WriteLine(" ';    ''   ''      '    '     '");
         Console.WriteLine(" ';     ';  '.'     '    '      ''");
         Console.WriteLine(" ';     .'  '.:'    '    '     ';");
         Console.WriteLine(" ';      '  '. ';   '    '     :'");
         Console.WriteLine(" ';      '  '.  '.  '    '''''''");
         Console.WriteLine(" ';      '  '.   '  '    '     ''");
         Console.WriteLine(" ';      '  '.   .' '    '      '");
         Console.WriteLine(" ';     ''  '.    ; ''   '      '");
         Console.WriteLine(" ';    :'   '.     ''    '     '");
         Console.WriteLine(" '''''''    '.      '    ''''''':");
         Console.WriteLine("            '.");
         Console.WriteLine("            '.");
         Console.WriteLine("");
      }

      // Visker ut teksten på aktiv linje
      private static void viskUtLinje()
      {
         Console.SetCursorPosition(0, Console.CursorTop - 1);
         for (int i = 0; i < Console.BufferWidth; i++)
         {
            Console.Write(" ");
         }
         Console.SetCursorPosition(0, Console.CursorTop - 1);
      }

      static void Main(string[] argumenter)
      {
         // Variabler
         bool kuleFarger = false;

         // Behandler argumenter
         foreach (string argument in argumenter) {
            if (argument.Equals("-kulefarger")) {
               kuleFarger = true;
            }
         }

         ///////////////////////////////////////////////////
         ///////////////////////////////////////////////////

         // Klargjør skjerm
         if (kuleFarger) {
            Console.BackgroundColor = ConsoleColor.White;
            Console.ForegroundColor = ConsoleColor.DarkGreen;
         }
         Console.Clear();
         visLogo();
         Console.WriteLine("Velkommen til DNBs retro fjerntilgang. :)");
         Console.WriteLine("");

         // Inndata
         string personnummer = "";
         string passord = "";
         while (true)
         {
            // Innlogget med bruker
            if (personnummer.Equals("123456 12345") && passord.Equals("passord"))
            {
               // Utdata
               Console.WriteLine("Hei, Ove Bakken!");
               Console.WriteLine("Kontobalanse: {0:c}", new Random().Next(50, 50000));

               break;
            }

            // Ikke innlogget enda
            else
            {
               Console.Write("Personnummer: ");
               personnummer = Console.ReadLine();
               viskUtLinje();

               Console.Write("Passord: ");
               passord = Console.ReadLine();
               viskUtLinje();
            }
         }

         // Avslutt
         Console.WriteLine();
         Console.Write("Avslutt med 'Enter': ");
         Console.ReadLine();

         // Tøm skjerm og nullstill farger
         Console.Clear();
         if (kuleFarger)
         {
            // Skulle gjerne brukt Console.ResetColor(), men ser ikke ut til å virke
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
         }
         Console.Clear();
      }
   }
}

Denne koden kan kopieres, limes inn, kompileres, og så kjøres av hvem som helst så lenge .NET / Mono og kompilator er installert og satt opp riktig.

Ved kjøring hvor argumentet for kule farger er gitt:

Først må man oppgi et gyldig personnummer:

Personnummeret gjemmes vekk før man så skriver passordet:

Når personnummer og passord er riktig vises til slutt kontoinformasjonen:

Til slutt avslutter man med å trykke en gang til på Enter.

Klassen Console har selvsagt flere metoder og egenskaper enn det som kommer frem i eksemplene over: https://msdn.microsoft.com/en-us/library/system.console(v=vs.110).aspx

Men alt er ikke like relevant eller av interesse.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *