Probleme cu siruri de caractere

Posted by anghelvalentin on September 25, 2019

La multe interviuri ti se dau probleme cu siruri de caractere. De obcei, sunt probleme cum ar fi asta sau asta. Dar mai exista si probleme mici, care baga in ceata multi programatori.

  1. Adunare char-urilor: O simpla line de cod reuseste sa filtreze foarte multi programatori
Console.WriteLine('a'+'b'+'c');

Ce crezi ca afiseaza linia de mai sus ? Ai fi tentat sa zica ca abc, dar ceva din mintea ta iti spune ca problema nu are cum sa fie asa simpla. Corect, nu e asa simplu. Acum iti voi spune care e secretul si vreau sa-l retii pentru ca sigur se va trezi la un moment dat un intervievator “destept” sa puna aceasta intrebare.

Operatorul plus nu este supraincarcat pentru char. Din acest motiv, literele acelea sunt converite in codul ASCI asociat, iar codul este cel adunat. Litera a are codul 97, iar rezultatul afisat este 294 (97+98+99).

Hai sa te vad daca ai inteles, ce afiseaza linia de mai jos:

Console.WriteLine("A"+"B"+"C");

Sper ca nu te gandesti sa convertesti in codul ASCI. Aici sunt folosite ghilimele duble, deci literele alea sunt string-uri, nu caractere, iar pentru string avem supraincarcat operatorul plus.


  1. Modificare stringurilor in metode
static void AddSign(string nume)
{
	nume += "TEST";
}


static void Main()
{
	string carName = "Mercedes";
	AddSign(carName);
	Console.WriteLine(carName);
}

Ce crezi ca afiseaza ? Sper ca nu ai zis MercedesTEST ca te mananc. Stringurile sunt imutabile, adica nu poti sa le schimbi referinta. In momentul in care aduni doua stringuri, se creeaza un al treilea string cu o adresa diferita. Noi trimitem in metoda respectiva un string cu o adresa, si folosim operatorul +=, care concateneaza cele doua stringuri, creand unul nou a carui adresa va fi cea salvata in variabila referinta. Dupa aceea, se intoarce in functia din care am apelat metoda, dar acolo avem vechea adresa catre string si astfel se afiseaza vechiul string.

Daca totusi vrei ca metoda apelata sa poata schimba referinta pentru variabila cu care am apelat-o, atunci vom folosi keyword-ul ref:

static void AddSign(string ref nume)
{
	nume += "TEST";
}


static void Main()
{
	string carName = "Mercedes";
	AddSign(carName);
	Console.WriteLine(ref carName);
}

Codul sursa