<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rdflorea</id>
	<title>WikiLabs - Contribuții utilizator [ro]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rdflorea"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Rdflorea"/>
	<updated>2026-05-24T19:28:52Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:BasicStorage.png&amp;diff=4036</id>
		<title>Fișier:BasicStorage.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:BasicStorage.png&amp;diff=4036"/>
		<updated>2015-12-09T19:39:29Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: Rdflorea a încărcat o nouă versiune pentru Fișier:BasicStorage.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:BasicStorage.png&amp;diff=4035</id>
		<title>Fișier:BasicStorage.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:BasicStorage.png&amp;diff=4035"/>
		<updated>2015-12-09T19:38:53Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Virtualbox1.png&amp;diff=4034</id>
		<title>Fișier:Virtualbox1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Virtualbox1.png&amp;diff=4034"/>
		<updated>2015-12-09T19:38:09Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: Rdflorea a încărcat o nouă versiune pentru Fișier:Virtualbox1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Virtualbox1.png&amp;diff=4033</id>
		<title>Fișier:Virtualbox1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Virtualbox1.png&amp;diff=4033"/>
		<updated>2015-12-09T19:37:23Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=InstalareCentOS&amp;diff=4032</id>
		<title>InstalareCentOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=InstalareCentOS&amp;diff=4032"/>
		<updated>2015-12-09T19:34:37Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Create Custom Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Instalare CentOS din VirtualBox=&lt;br /&gt;
&lt;br /&gt;
==Download CentOS ISO==&lt;br /&gt;
Instalarea începe prin descărcarea ISO-ului necesar accesând următorul link https://www.centos.org/download/&lt;br /&gt;
&lt;br /&gt;
==Instalare VirtualBox==&lt;br /&gt;
&lt;br /&gt;
Deschideți https://www.virtualbox.org/ și descărcați mașina virtuala potrivită sistemului de operare actual.&lt;br /&gt;
Pentru Linux/Ubuntu deschideți un terminal și accesați următoarea comandă: &amp;lt;code&amp;gt; sudo apt-get install virtualbox &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configurari în VirtualBox==&lt;br /&gt;
După instalare,porniți mașina virtuală care ar trebui să arate sub aceasta formă:&lt;br /&gt;
[[Fișier:Virtualbox1.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Creare mașină virtuală==&lt;br /&gt;
Pentru a creea o nouă mașină virtuală click pe NEW icon din bara de instrumente sau mergeți pe Machine-New sau folosiți scurtătura CTRL+N&lt;br /&gt;
[[Fișier:New.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
===Name and operating system===&lt;br /&gt;
&lt;br /&gt;
Setați numele,tipul si versiunea pentru noua mașină virtuală.&lt;br /&gt;
#Name: Puteți alege orice nume pentru mașina virtuală însă recomandat este un nume sugestiv pentru sistemul de operare folosit,astfel daca numele va fi CentOS,celelalte doua câmpuri se vor completa automat.&lt;br /&gt;
#Type: Linux (în acest caz,instalare CentOS)&lt;br /&gt;
#Version: Alegeți Red Hat 32 sau 64 bit sau Other Linux&lt;br /&gt;
&lt;br /&gt;
===Memory Size===&lt;br /&gt;
Instalarea software-ului necesită alocarea unei cantitați de memorie pentru a funcționa mașina virutală. Setați Memory VM la cel puțin 1024MB, apoi click NEXT.&lt;br /&gt;
[[Fișier:Memorysize.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
===Hard Disk===&lt;br /&gt;
&lt;br /&gt;
Selectați crate a virtual hard drive now și click Create,o nouă fereastră se deschide.&lt;br /&gt;
&lt;br /&gt;
====Hard Disk file type====&lt;br /&gt;
&lt;br /&gt;
Selectați VDI(VirtualBox Disk Image) si click Next.&lt;br /&gt;
&lt;br /&gt;
====Storage on physical hard drive====&lt;br /&gt;
&lt;br /&gt;
Selectați Dynamically allocated si click Next.&lt;br /&gt;
&lt;br /&gt;
===File location and size===&lt;br /&gt;
&lt;br /&gt;
*În acest moment puteți selecta marimea maximă pe care o poate lua hard disk-ul virtual. Puteți trage de cursor sau insera direct in casuța dedicată numărul ce doriți să-l alocați urmat de unitatea de măsură (MB,GB).&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;1024 MB = 1 GB&amp;lt;/div&amp;gt;&lt;br /&gt;
*Numele poate rămâne cel setat anterior.&lt;br /&gt;
*Click Create.&lt;br /&gt;
[[Fișier:Filelocation.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Booting CentOS==&lt;br /&gt;
&lt;br /&gt;
Având mașina virtuală selectată &lt;br /&gt;
*Click Settings&lt;br /&gt;
*În partea stângă din meniul de navigare selectăm System&lt;br /&gt;
*În tab-ul Motherboard selecet la Boot Order CD/DVD sau Optic și Hard Disk. Dacă acestea sunt deja bifate,putem închide fereastra nou deschisă.&lt;br /&gt;
*Click OK&lt;br /&gt;
&lt;br /&gt;
==Activare CentOS ISO din virtual CD/DVD==&lt;br /&gt;
*Click Settings&lt;br /&gt;
*În partea stângă din meniul de navigare selectăm Storage. Vom vedea Storage Tree în care avem Controller:IDE și in interiorul acestuia numele mașinii virtuale create.&lt;br /&gt;
*Click pe pictograma CD unde apare și câmpul Empty, în aceeași fereastră o nouă lista va apărea în partea dreaptă.&lt;br /&gt;
*În panoul Attributes alături de Live CD/DVD, veti observa o casetă care conține IDE Secondary Master. Click pe pictograma CD-ului pentru a deschide meniul ce vă permite sa setați calea către fișierul ISO descărcat.&lt;br /&gt;
*Înainte de a apăsa OK fereastra va arăta sub forma din imagine.&lt;br /&gt;
[[Fișier:Isod.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Start/Instalare CentOS==&lt;br /&gt;
Vom obersa că fereastra a revenit la meniul anterior,astfel putem deschide mașina virtuala prin dublu click pe numele acestuia,fie prin click pe START.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Aveți doar 10 secunde pentru a apăsa pe orice tastă&amp;lt;/div&amp;gt;&lt;br /&gt;
*Selectăm Install ce ne va deschide o nouă fereastră de instalare specifică CentOS.&lt;br /&gt;
*Derulăm fereastra până obervăm butonul Next pe care dăm click.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest moment pentru a face switch între cursorul pentru cele două ferestre se va apăsa combinația de taste Right Ctrl&amp;lt;/div&amp;gt;&lt;br /&gt;
*Selectăm Romania, click Next.&lt;br /&gt;
*Selectăm limba dorită pentru tastatură Romanian, click Next.&lt;br /&gt;
*Bifăm Basic Storage Devices și va apărea urmatoarea fereastră.&lt;br /&gt;
[[Fișier:BasicStorage.png|miniatura]]&lt;br /&gt;
*Alegem YES,discard any data deoarece nu avem nimic stocat ce dorim să păstrăm,alegerea celei de a doua variantă va conduce la o revenire cu un pus a instalării.&lt;br /&gt;
*Selectăm numele de host cu care vom fi identificați. Click Next.&lt;br /&gt;
*Utilizând harta sau inserând direct fusul orar,sincronizăm sistem de operare cu time zone. Click Next.&lt;br /&gt;
*Contul de root necesită o parola,odată introdusă si confirmată click Next.&lt;br /&gt;
&lt;br /&gt;
===Partiționare===&lt;br /&gt;
&lt;br /&gt;
====Partiționare automata====&lt;br /&gt;
Partiționarea automată se poate face alegând Replace Existing Linux System.&lt;br /&gt;
====Create Custom Layout====&lt;br /&gt;
Alegând Create Custom Layout putem împărții după preferințe cei 8GB de memorie selectați la începutul instalării.&lt;br /&gt;
*Create&lt;br /&gt;
*Standard Partition&lt;br /&gt;
În acest moment alegem punctul de montare și tipul sistemului de fișiere.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=InstalareCentOS&amp;diff=3990</id>
		<title>InstalareCentOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=InstalareCentOS&amp;diff=3990"/>
		<updated>2015-12-06T21:43:33Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: Pagină nouă:  =Instalare CentOS din VirtualBox=  ==Download CentOS ISO== Instalarea începe prin descărcarea ISO-ului necesar accesând următorul link https://www.centos.org/download/  ==Inst...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Instalare CentOS din VirtualBox=&lt;br /&gt;
&lt;br /&gt;
==Download CentOS ISO==&lt;br /&gt;
Instalarea începe prin descărcarea ISO-ului necesar accesând următorul link https://www.centos.org/download/&lt;br /&gt;
&lt;br /&gt;
==Instalare VirtualBox==&lt;br /&gt;
&lt;br /&gt;
Deschideți https://www.virtualbox.org/ și descărcați mașina virtuala potrivită sistemului de operare actual.&lt;br /&gt;
Pentru Linux/Ubuntu deschideți un terminal și accesați următoarea comandă: &amp;lt;code&amp;gt; sudo apt-get install virtualbox &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configurari în VirtualBox==&lt;br /&gt;
După instalare,porniți mașina virtuală care ar trebui să arate sub aceasta formă:&lt;br /&gt;
[[Fișier:Virtualbox1.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Creare mașină virtuală==&lt;br /&gt;
Pentru a creea o nouă mașină virtuală click pe NEW icon din bara de instrumente sau mergeți pe Machine-New sau folosiți scurtătura CTRL+N&lt;br /&gt;
[[Fișier:New.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
===Name and operating system===&lt;br /&gt;
&lt;br /&gt;
Setați numele,tipul si versiunea pentru noua mașină virtuală.&lt;br /&gt;
#Name: Puteți alege orice nume pentru mașina virtuală însă recomandat este un nume sugestiv pentru sistemul de operare folosit,astfel daca numele va fi CentOS,celelalte doua câmpuri se vor completa automat.&lt;br /&gt;
#Type: Linux (în acest caz,instalare CentOS)&lt;br /&gt;
#Version: Alegeți Red Hat 32 sau 64 bit sau Other Linux&lt;br /&gt;
&lt;br /&gt;
===Memory Size===&lt;br /&gt;
Instalarea software-ului necesită alocarea unei cantitați de memorie pentru a funcționa mașina virutală. Setați Memory VM la cel puțin 1024MB, apoi click NEXT.&lt;br /&gt;
[[Fișier:Memorysize.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
===Hard Disk===&lt;br /&gt;
&lt;br /&gt;
Selectați crate a virtual hard drive now și click Create,o nouă fereastră se deschide.&lt;br /&gt;
&lt;br /&gt;
====Hard Disk file type====&lt;br /&gt;
&lt;br /&gt;
Selectați VDI(VirtualBox Disk Image) si click Next.&lt;br /&gt;
&lt;br /&gt;
====Storage on physical hard drive====&lt;br /&gt;
&lt;br /&gt;
Selectați Dynamically allocated si click Next.&lt;br /&gt;
&lt;br /&gt;
===File location and size===&lt;br /&gt;
&lt;br /&gt;
*În acest moment puteți selecta marimea maximă pe care o poate lua hard disk-ul virtual. Puteți trage de cursor sau insera direct in casuța dedicată numărul ce doriți să-l alocați urmat de unitatea de măsură (MB,GB).&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;1024 MB = 1 GB&amp;lt;/div&amp;gt;&lt;br /&gt;
*Numele poate rămâne cel setat anterior.&lt;br /&gt;
*Click Create.&lt;br /&gt;
[[Fișier:Filelocation.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Booting CentOS==&lt;br /&gt;
&lt;br /&gt;
Având mașina virtuală selectată &lt;br /&gt;
*Click Settings&lt;br /&gt;
*În partea stângă din meniul de navigare selectăm System&lt;br /&gt;
*În tab-ul Motherboard selecet la Boot Order CD/DVD sau Optic și Hard Disk. Dacă acestea sunt deja bifate,putem închide fereastra nou deschisă.&lt;br /&gt;
*Click OK&lt;br /&gt;
&lt;br /&gt;
==Activare CentOS ISO din virtual CD/DVD==&lt;br /&gt;
*Click Settings&lt;br /&gt;
*În partea stângă din meniul de navigare selectăm Storage. Vom vedea Storage Tree în care avem Controller:IDE și in interiorul acestuia numele mașinii virtuale create.&lt;br /&gt;
*Click pe pictograma CD unde apare și câmpul Empty, în aceeași fereastră o nouă lista va apărea în partea dreaptă.&lt;br /&gt;
*În panoul Attributes alături de Live CD/DVD, veti observa o casetă care conține IDE Secondary Master. Click pe pictograma CD-ului pentru a deschide meniul ce vă permite sa setați calea către fișierul ISO descărcat.&lt;br /&gt;
*Înainte de a apăsa OK fereastra va arăta sub forma din imagine.&lt;br /&gt;
[[Fișier:Isod.png|miniatura]]&lt;br /&gt;
&lt;br /&gt;
==Start/Instalare CentOS==&lt;br /&gt;
Vom obersa că fereastra a revenit la meniul anterior,astfel putem deschide mașina virtuala prin dublu click pe numele acestuia,fie prin click pe START.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;Aveți doar 10 secunde pentru a apăsa pe orice tastă&amp;lt;/div&amp;gt;&lt;br /&gt;
*Selectăm Install ce ne va deschide o nouă fereastră de instalare specifică CentOS.&lt;br /&gt;
*Derulăm fereastra până obervăm butonul Next pe care dăm click.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt; &amp;#039;&amp;#039;&amp;#039;În acest moment pentru a face switch între cursorul pentru cele două ferestre se va apăsa combinația de taste Right Ctrl&amp;lt;/div&amp;gt;&lt;br /&gt;
*Selectăm Romania, click Next.&lt;br /&gt;
*Selectăm limba dorită pentru tastatură Romanian, click Next.&lt;br /&gt;
*Bifăm Basic Storage Devices și va apărea urmatoarea fereastră.&lt;br /&gt;
[[Fișier:BasicStorage.png|miniatura]]&lt;br /&gt;
*Alegem YES,discard any data deoarece nu avem nimic stocat ce dorim să păstrăm,alegerea celei de a doua variantă va conduce la o revenire cu un pus a instalării.&lt;br /&gt;
*Selectăm numele de host cu care vom fi identificați. Click Next.&lt;br /&gt;
*Utilizând harta sau inserând direct fusul orar,sincronizăm sistem de operare cu time zone. Click Next.&lt;br /&gt;
*Contul de root necesită o parola,odată introdusă si confirmată click Next.&lt;br /&gt;
&lt;br /&gt;
===Partiționare===&lt;br /&gt;
&lt;br /&gt;
====Partiționare automata====&lt;br /&gt;
Partiționarea automată se poate face alegând Replace Existing Linux System.&lt;br /&gt;
====Create Custom Layout====&lt;br /&gt;
Alegând Create Custom Layout putem împărții după preferințe cei 8GB de memorie selectați la începutul instalării.&lt;br /&gt;
*Create&lt;br /&gt;
*Standard Partition&lt;br /&gt;
În acest moment alegem punctul de montare și tipul sistemului de fișiere după cum urmează:&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3908</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3908"/>
		<updated>2015-12-02T22:25:57Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;HINT: asemenea funcției strcmp &amp;lt;/font&amp;gt;.Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3907</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3907"/>
		<updated>2015-12-02T22:23:59Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.( &amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;HINT:&amp;lt;/font&amp;gt;&amp;#039;asemenea funcției strcmp).Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3906</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3906"/>
		<updated>2015-12-02T22:23:43Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.( &amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;HINT:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;asemenea funcției strcmp).Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3905</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3905"/>
		<updated>2015-12-02T22:21:56Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.(HINT: asemenea funcției strcmp).Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3904</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3904"/>
		<updated>2015-12-02T22:20:47Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.HINT: asemenea funcției strcmp.Funcția ce trebuie realizată întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3903</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3903"/>
		<updated>2015-12-02T22:20:04Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere.Funcția primește doi vectori de caractere și are un rezultat întreg.HINT: strcmp Funcția întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3902</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3902"/>
		<updated>2015-12-02T22:18:58Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere (HINT: asemenea strcmp).Funcția primește doi vectori de caractere și are un rezultat întreg.Funcția întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la începutul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3901</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3901"/>
		<updated>2015-12-02T22:18:41Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere (HINT: asemenea strcmp).Funcția primește doi vectori de caractere și are un rezultat întreg.Funcția întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort vor fi plasate la inceputul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3900</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3900"/>
		<updated>2015-12-02T22:18:07Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere (HINT: asemenea strcmp).Funcția primește doi vectori de caractere și are un rezultat întreg.Funcția întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort să fie la inceputul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3899</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3899"/>
		<updated>2015-12-02T22:17:39Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere (HINT: asemenea strcmp).Funcția primește doi vectori de caractere și are un rezultat întreg.Funcția întoarce:&lt;br /&gt;
#*număr pozitiv dacă primul șir e mai mare&lt;br /&gt;
#*număr negativ dacă primul sir e mai mic&lt;br /&gt;
#*zero dacă sunt egale&lt;br /&gt;
#Scrieți o funcție &amp;lt;code&amp;gt;Sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort să fie la inceputul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3898</id>
		<title>PC Laborator 9</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_9&amp;diff=3898"/>
		<updated>2015-12-02T22:15:57Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Obiective =&lt;br /&gt;
  &lt;br /&gt;
În urma acestui laborator, studentul va fi capabil: &lt;br /&gt;
* să înțeleagă conceptul de funcție;&lt;br /&gt;
* să definească funcții, sub formă de prototip și implementare;&lt;br /&gt;
* să apeleze funcții;&lt;br /&gt;
* să utilizeze corect cuvintele cheie &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Funcții =&lt;br /&gt;
&lt;br /&gt;
Funcțiile sunt secțiuni ale unui program care se pot apela de mai multe ori, care pot modifica starea programului (prin modificarea variabilelor sau operații de IO - citire și scriere de date) și care pot întoarce un rezultat.&lt;br /&gt;
&lt;br /&gt;
== Definirea/ Declararea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
O funcție în C este definită în următorul fel:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_tip_argumente);&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; definește tipul de date din care face parte valoarea returnată de funcție; dacă funcția nu întoarce nici o valoare (este folosit exclusiv pentru modificarea stării programului sau pentru IO), atunci se mai numește și procedură, iar tipul returnat este &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_functie&amp;lt;/code&amp;gt; reprezintă numele funcției care este folosit ulterior pentru apelul ei, și care respectă aceleași reguli ca orice identificator generic din C: poate conține exclusiv cifre, litere mici și mari, caracterul underscore (_), și nu poate începe cu cifră;&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_tip_argumente&amp;lt;/code&amp;gt; reprezintă o listă de tipuri de date, separate prin virgulă, din care fac parte argumentele funcției; această listă poate fi goală (dacă funcția nu are argumente).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O declarație de funcție se numește și &amp;lt;span style=&amp;quot;color: blue; font-weight: bold&amp;quot;&amp;gt;prototip&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de definiții de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float, float);&lt;br /&gt;
int inc (int);&lt;br /&gt;
void print (char[]);&lt;br /&gt;
int getAge ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementarea unei funcții ==&lt;br /&gt;
&lt;br /&gt;
Implementarea unei funcții în C se face în felul următor:&lt;br /&gt;
&lt;br /&gt;
 tip_returnat nume_functie (lista_argumente) {&lt;br /&gt;
     statement_1&lt;br /&gt;
     statement_2&lt;br /&gt;
     ...&lt;br /&gt;
     statement_n&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
unde:&lt;br /&gt;
* &amp;lt;code&amp;gt;tip_returnat&amp;lt;/code&amp;gt; reprezintă tipul returnat al funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;nume_funcție&amp;lt;/code&amp;gt; reprezintă numele funcției (vezi definiția unei funcții);&lt;br /&gt;
* &amp;lt;code&amp;gt;lista_argumente&amp;lt;/code&amp;gt; reprezintă o listă de definiții de variabile (de forma &amp;quot;tip_data nume_variabilă&amp;quot;) care sunt argumentele funcției; această listă poate fi goală;&lt;br /&gt;
* &amp;lt;code&amp;gt;statement_...&amp;lt;/code&amp;gt; reprezintă una sau mai multe instructiuni (&amp;#039;&amp;#039;statement&amp;#039;&amp;#039;) C care implementează comportamentul funcției și care se execută de fiecare dată când se apelează funcția; corpul unei funcții poate fi gol (poate să nu conțină nici un statement), dar atunci apelul ei nu are nici un efect; dacă funcția nu este de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, atunci obligatoriu ultima instrucțiune executată din funcție trebuie să fie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, care setează valoarea întoarsă de funcție.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de implementări de funcții ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float max (float a, float b) {&lt;br /&gt;
    if (a &amp;gt;= b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int inc (int value) {&lt;br /&gt;
    return value + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print (char[] string) {&lt;br /&gt;
    printf(&amp;quot;%s&amp;quot;, string);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int getAge() {&lt;br /&gt;
    return 20;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observații ==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție nu este accesibilă/ apelabilă până nu este definită în program.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Nu pot exista mai multe funcții cu același nume.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție poate avea cel mult o definiție și o implementare, dar definiția trebuie să fie plasată înaintea implementării.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; O funcție definită și ne-implementată poate fi apelată, și fișierul va compila cu succes, dar linker-ul nu va reuși să creeze fișierul executabil. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int inc(int);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;n + 1 = %d\n&amp;quot;, inc(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Implementarea unei funcții ține loc implicit și de definiție, dacă aceasta nu există deja.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; oprește execuția funcției, indiferent dacă mai există sau nu instrucțiuni după &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Cuvântul cheie &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; poate fi folosit și în funcții &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar urmat doar de punct și virgulă (;) și are ca efect ieșirea imediată din funcție. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printIfNotZero(int value) {&lt;br /&gt;
    if (value == 0) return;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S-a apelat functia printIfNotZero cu valoarea %d.\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printIfNotZero(1);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    printIfNotZero(2);&lt;br /&gt;
    printIfNotZero(3);&lt;br /&gt;
    printIfNotZero(0);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;În C, argumentele unei funcții sunt &amp;quot;pass-by-value&amp;quot;, în sensul că ele conțin valorile variabilelor cu care se apelează funcția, nu se identifică cu aceste variabile. Altfel spus, modificarea unui argument al funcției nu se propagă în afara funcției. Ca exemplu, încercați scrierea, compilarea și execuția acestui program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void inc(int value) {&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la intrare, value este %d\n&amp;quot;, value);&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    printf(&amp;quot;In &amp;#039;inc&amp;#039;, la iesire, value este %d\n&amp;quot;, value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 3;&lt;br /&gt;
    printf(&amp;quot;Inainte de &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    inc(n);&lt;br /&gt;
    printf(&amp;quot;După &amp;#039;inc&amp;#039;, n este egal cu %d\n&amp;quot;, n);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programe din mai multe fișiere =&lt;br /&gt;
&lt;br /&gt;
Programele complexe pot fi sparte în mai multe fișiere. În general, prin convenție, într-un fișier se scriu funcții care au legătură între ele, în sensul că sunt folosite pentru aceeași funcționalitate (de exemplu, funcții pentru criptare, sau funcții pentru IO, sau funcții pentru operații matematice, etc.). Pentru că aceste funcții pot teoretic fi folosite în multiple alte funcții din alte fișiere, sistemul cel mai des întâlnit pentru separarea acestor funcții este următorul:&lt;br /&gt;
* prototipurile funcțiilor se scriu într-un fișier cu extensia .h (header), iar acest fișier header este inclus acolo unde aceste funcții sunt apelate; aceste fișiere header trebuie obligatoriu să aibă gardă de dublă incluziune.&lt;br /&gt;
* implementările funcțiilor se scriu într-un fișier sursă .c, care include header-ul de mai sus, și care este compilat separat într-un object file.&lt;br /&gt;
* toate fișierele obiect se link-editează apoi într-un fișier executabil.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CUSTOM_MATH_H&lt;br /&gt;
#define CUSTOM_MATH_H&lt;br /&gt;
&lt;br /&gt;
long long factorial (int);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;custom_math.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
long long factorial (int n) {&lt;br /&gt;
    long long result = 1;&lt;br /&gt;
    int i;&lt;br /&gt;
    if (n &amp;lt; 0) return 0;&lt;br /&gt;
    for (i = 2; i &amp;lt; n; i++) {&lt;br /&gt;
        result *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;main.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;custom_math.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    printf(&amp;quot;n = &amp;quot;);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    printf(&amp;quot;%d! = %d\n&amp;quot;, n, factorial(n));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
Pentru a obține executabilul pentru exemplul de mai sus, se compilează fiecare fișier sursă într-un object file:&lt;br /&gt;
 gcc -c custom_math.c -o custom_math.o&lt;br /&gt;
 gcc -c main.c -o main.o&lt;br /&gt;
&lt;br /&gt;
Apoi, se link-editează cele două surse împreună într-un executabil:&lt;br /&gt;
 gcc custom_math.o main.o -o main&lt;br /&gt;
&lt;br /&gt;
== Makefile pentru compilarea unui executabil din mai multe fișiere ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
C_FILES=custom_math.c main.c&lt;br /&gt;
OBJ_FILES=$(C_FILES:.c=.o)&lt;br /&gt;
&lt;br /&gt;
main: $(OBJ_FILES)&lt;br /&gt;
	gcc $^ -o $@&lt;br /&gt;
&lt;br /&gt;
%.o: %.c&lt;br /&gt;
	gcc -c $^ -o $@&lt;br /&gt;
&lt;br /&gt;
.PHONY: clear&lt;br /&gt;
clear:&lt;br /&gt;
	rm -rf main $(OBJ_FILES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt; definește o variabilă care conține o listă cu fișierele sursă ce se doresc compilate.&lt;br /&gt;
# &amp;lt;code&amp;gt;OBJ_FILES&amp;lt;/code&amp;gt; reprezintă tot lista cu fișierele sursă, dar în care extensia .c se transformă în .o (astfel, se obține lista cu fișierele obiect necesare pentru compilare).&lt;br /&gt;
# Executabilul &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; depinde de toate fișierele obiect și se generează prin apelul lui &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regula &amp;lt;code&amp;gt;%.o: %.c&amp;lt;/code&amp;gt; este o regulă template care spune că dacă este necesară generarea unui fișier obiect, acesta depinde de un fișier cu același nume dar cu extensia .c, și se generează folosind tot un apel la &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru a compila și alte surse în acest Makefile, tot ce este necesar este să le adăugați la lista &amp;lt;code&amp;gt;C_FILES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exerciții =&lt;br /&gt;
&lt;br /&gt;
# Scrieți un program care să implementeze trei funcții:&lt;br /&gt;
#* &amp;lt;code&amp;gt;readTempCelsius&amp;lt;/code&amp;gt; care să citească să întoarcă un număr în virgulă reprezentând o temperatură în grade Celsius;&lt;br /&gt;
#* &amp;lt;code&amp;gt;celsius2fahrenheit&amp;lt;/code&amp;gt; care să convertească un argument din grade Celsius în grade Fahrenheit;&lt;br /&gt;
#* &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; care să folosească celelalte două funcții pentru a converti o temperatură citită din grade Celsius în Fahrenheit.&lt;br /&gt;
# Scrieți o funcție care să calculeze determinantul unei matrici de 3x3. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să primească ca argumente o matrice de numere întregi, dimensiunile ei și un număr întreg reprezentând o coloană, și să întoarcă suma numerelor de pe coloana respectivă. Funcția va afișa un mesaj și va întoarce 0 daca coloana nu există în matrice. Testați funcția integrând-o într-un program.&lt;br /&gt;
# Scrieți o funcție care să determine dacă un cuvânt este palindrom. Scrieți apoi un program care să citească cuvinte de la tastatură până când cuvântul introdus are lungimea 0. Pentru fiecare cuvânt introdus se va specifica dacă este sau nu palindrom.&lt;br /&gt;
#Scrieți o funcție care să compare doi vectori de caractere (HINT: asemenea strcmp).Funcția primește doi vectori de caractere și are un rezultat întreg (funcția întoarce un numar pozitiv dacă primul șir e mai mare,negativ dacă primul sir e mai mic sau zero dacă sunt egale).&lt;br /&gt;
#* Scrieți o funcție &amp;lt;code&amp;gt;Sortare&amp;lt;/code&amp;gt; care primește ca și argumente un întreg sort si un vector v. Funcția modifică elementele vectorului în funcție de întregul sort,astfel numere mai mari ca sort să fie la inceputul vectorului.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3851</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3851"/>
		<updated>2015-11-26T20:51:05Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if(sir_de_caractere [i] == 10) {&lt;br /&gt;
        sir_de_caractere [i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care citește de la tastatură un cuvânt.Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3850</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3850"/>
		<updated>2015-11-26T20:50:41Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; marchează sfârșitul șirului, iar acolo se oprește numărarea.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
    scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
    /* 10 este codul ascii pentru \n, adica enter */&lt;br /&gt;
    if(sir_de_caractere [i] == 10) {&lt;br /&gt;
        sir_de_caractere [i] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
fgets(sir_de_caractere, MAX_SIZE, stdin);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:&lt;br /&gt;
  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE]; &lt;br /&gt;
scanf(&amp;quot;%s&amp;quot;,sir_de_caractere); // citire sir de caractere&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE &amp;amp;&amp;amp; sir_de_caractere [i] != &amp;#039;\0&amp;#039;; i++) {&lt;br /&gt;
    printf (&amp;quot;%c&amp;quot;, sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    fgets(nume, 30, stdin);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Se citește de la tastatură un cuvânt. Să se afișeze cuvintele ce se obțin prin eliminarea succesiva a primei si ultimei litere din cuvântul citit.&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3805</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3805"/>
		<updated>2015-11-22T19:47:36Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Model de concatenare fără a utiliza strcat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
   char str1[10], str2[10], str3[20];&lt;br /&gt;
   int i, poz;&lt;br /&gt;
   printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
   printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
   scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
		str3[i] = str1[i];&lt;br /&gt;
		poz=i;&lt;br /&gt;
	for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
		str3[poz+i] = str2[i];&lt;br /&gt;
		str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3804</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3804"/>
		<updated>2015-11-22T19:46:32Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Model de concatenare fără a utiliza strcat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
        char str1[10], str2[10], str3[20];&lt;br /&gt;
	int i, poz;&lt;br /&gt;
	printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
	printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
			str3[i] = str1[i];&lt;br /&gt;
			poz=i;&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
			str3[poz+i] = str2[i];&lt;br /&gt;
			str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3803</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3803"/>
		<updated>2015-11-22T19:46:08Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len = strlen(str1);&lt;br /&gt;
	size = sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	char str1[10], str2[10], str3[20];&lt;br /&gt;
	int i, poz;&lt;br /&gt;
	printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
	printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
			str3[i] = str1[i];&lt;br /&gt;
			poz=i;&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
			str3[poz+i] = str2[i];&lt;br /&gt;
			str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3802</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3802"/>
		<updated>2015-11-22T19:44:29Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemplul de concatenare fără a utiliza strcat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Model de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	char str1[10], str2[10], str3[20];&lt;br /&gt;
	int i, poz;&lt;br /&gt;
	printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
	printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
			str3[i] = str1[i];&lt;br /&gt;
			poz=i;&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
			str3[poz+i] = str2[i];&lt;br /&gt;
			str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3801</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3801"/>
		<updated>2015-11-22T19:43:19Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple operații cu șiruri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplul de concatenare fără a utiliza strcat ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	char str1[10], str2[10], str3[20];&lt;br /&gt;
	int i, poz;&lt;br /&gt;
	printf(&amp;quot;Introduceti sir1: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str1);&lt;br /&gt;
	printf(&amp;quot;Introduceti sir2: &amp;quot;);&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,str2);&lt;br /&gt;
&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str1); i++)&lt;br /&gt;
			str3[i] = str1[i];&lt;br /&gt;
			poz=i;&lt;br /&gt;
		for (i = 0; i &amp;lt; strlen(str2); i++)&lt;br /&gt;
			str3[poz+i] = str2[i];&lt;br /&gt;
			str3[poz+i] =&amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			printf(&amp;quot;Sir concatenat: %s\n&amp;quot;,str3); &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3800</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3800"/>
		<updated>2015-11-22T19:26:09Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte de la tastatură o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3799</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3799"/>
		<updated>2015-11-22T19:25:55Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;br /&gt;
#Se citeşte o propoziţie (şir de caractere) terminată cu punct.Să se afişeze fiecare cuvânt din propoziţie pe câte o linie separată.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3798</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3798"/>
		<updated>2015-11-22T18:57:36Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* strchr vs strrchr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;quot;de&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3797</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3797"/>
		<updated>2015-11-22T18:42:42Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* strchr vs strrchr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter printre caractere&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
        printf (&amp;quot;Caz3: %s\n&amp;quot;, strstr(str1, &amp;#039;caractere&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3796</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3796"/>
		<updated>2015-11-22T18:39:17Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== strchr vs strrchr ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3795</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3795"/>
		<updated>2015-11-22T18:38:49Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație: strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Observație ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3794</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3794"/>
		<updated>2015-11-22T18:37:53Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple gets/puts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== Observație: strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Observație ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple gets/puts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3793</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3793"/>
		<updated>2015-11-22T18:37:49Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple operații cu șiruri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== Observație: strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Observație ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple operații cu șiruri===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3792</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3792"/>
		<updated>2015-11-22T18:37:43Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== Observație: strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Observație ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3791</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3791"/>
		<updated>2015-11-22T18:37:26Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație: strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Observații și exemple==&lt;br /&gt;
&lt;br /&gt;
=== Observație: strlen vs sizeof ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observație ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3790</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3790"/>
		<updated>2015-11-22T18:36:37Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație: strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Observație: strlen vs sizeof==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Observație ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3789</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3789"/>
		<updated>2015-11-22T18:36:16Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație: strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Observație: strlen vs sizeof==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
== Observație ==&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	char str1[40] = &amp;quot;Cautare de caracter&amp;quot;;&lt;br /&gt;
    	printf (&amp;quot;Caz1: %s\n&amp;quot;, strchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
    	printf (&amp;quot;Caz2: %s\n&amp;quot;, strrchr(str1, &amp;#039;a&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3788</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3788"/>
		<updated>2015-11-22T18:25:17Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Observație strlen vs sizeof */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Observație: strlen vs sizeof==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3787</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3787"/>
		<updated>2015-11-22T18:25:08Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple operații cu șiruri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Observație strlen vs sizeof==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	char str1[20] = &amp;quot;StringLab&amp;quot;;&lt;br /&gt;
	int len,size;&lt;br /&gt;
&lt;br /&gt;
	len=strlen(str1);&lt;br /&gt;
	size=sizeof(str1); &lt;br /&gt;
	printf(&amp;quot;Lungimea str1: %d\n&amp;quot;, len);&lt;br /&gt;
	printf(&amp;quot;Lungimea total alocata str1: %d\n&amp;quot;, size);&lt;br /&gt;
&lt;br /&gt;
     return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3786</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3786"/>
		<updated>2015-11-22T18:15:17Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemplu gets/puts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemple gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.&lt;br /&gt;
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3785</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3785"/>
		<updated>2015-11-22T18:04:04Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Afișarea unui șir de caractere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați.&lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplu gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3784</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3784"/>
		<updated>2015-11-22T18:02:52Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple operații cu șiruri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplu gets/puts ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
    char nume[30];&lt;br /&gt;
    printf(&amp;quot;Numele este: &amp;quot;);&lt;br /&gt;
   /* Citește string de la utilizator */&lt;br /&gt;
    gets(name);     &lt;br /&gt;
    printf(&amp;quot;Nume: &amp;quot;);&lt;br /&gt;
   /* Afișează string */&lt;br /&gt;
    puts(nume);    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3783</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3783"/>
		<updated>2015-11-22T17:59:49Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Exemple operații cu șiruri==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3782</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3782"/>
		<updated>2015-11-22T17:57:50Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3781</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3781"/>
		<updated>2015-11-22T17:57:37Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Exemple ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3780</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3780"/>
		<updated>2015-11-22T17:55:18Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3779</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3779"/>
		<updated>2015-11-22T17:53:57Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3778</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3778"/>
		<updated>2015-11-22T17:49:18Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;String Lab&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3777</id>
		<title>PC Laborator 8</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_8&amp;diff=3777"/>
		<updated>2015-11-22T17:48:31Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Inserția unui șir de caractere într-un alt șir */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Obiective == &lt;br /&gt;
  &lt;br /&gt;
în urma acestui laborator, studentul va fi capabil să: &lt;br /&gt;
*înțeleagă cum funcționează șirurile de caractere &lt;br /&gt;
*facă operații cu șiruri de caractere&lt;br /&gt;
&lt;br /&gt;
== Șiruri de caractere == &lt;br /&gt;
  &lt;br /&gt;
În C, tipul de dată șir nu există în mod implicit. Singurul mod prin care putem opera cu șiruri este folosind tablourile unidimensionale, vectorii. Ne amintim că un vector este definit complet prin intermediul a trei caracteristici: tipul de date conținute, numele vectorului și numărul său de elemente. Așadar, putem declara un vector al cărui tip de data să fie char, caz în care acel vector va fi denumit șir (de caractere). &lt;br /&gt;
Declararea unui șir de caractere se face astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char numele_sirului [numarul_de_caractere];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Spre deosebire de vectorii studiați în laboratorul anterior, ale căror elemente sunt precizate explicit, șirurile au un caracter special, implicit, numit end of string și reprezentat astfel: \0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operații cu șiruri == &lt;br /&gt;
  &lt;br /&gt;
Toate proprietățile vectorilor, studiate în laboratorul anterior, sunt valabile și în cazul șirurilor. De asemenea, toate operațiile pe care le putem face cu vectori sunt posibile și în cazul șirurilor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Există  anumite operații asociate exclusiv șirurilor, precum căutarea unor caractere sau a unui șir într-un alt șir, concatenarea, etc. Toate aceste operații au funcții predefinite, care pot fi găsite într-un header specific, string.h. &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aflarea lungimii unui șir de caractere === &lt;br /&gt;
Pe lângă metoda clasică, discutată în capitolul anterior, ce presupune parcurgerea șirului și numărarea elementelor acestuia, avem și o metodă proprie șirurilor. Ea presupune apelarea funcției strlen(), predefinita în biblioteca string.h, care va întoarce numărul de elemente al șirului. &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Caracterul &amp;#039;\0&amp;#039; nu este caracter util în lungime, deci el nu este contorizat și nici numărat.  &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lungime_sir = strlen (sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Citirea unui șir de caractere === &lt;br /&gt;
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere. &lt;br /&gt;
&lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	scanf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
scanf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
gets(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afișarea unui șir de caractere === &lt;br /&gt;
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:  &lt;br /&gt;
1. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
int i;&lt;br /&gt;
for (i = 0; i &amp;lt; MAX_SIZE; i++) {&lt;br /&gt;
	printf (&amp;quot;%c&amp;quot;, &amp;amp;sir_de_caractere [i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Sintaxa generala&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
printf (&amp;quot;%s&amp;quot;, sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3. Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE];&lt;br /&gt;
puts(sir_de_caractere);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Fie șirul de caractere sir[10]. Citiți următoarea frază folosind toate cele 3 metode, apoi afișați conținutul șirului folosind puts();. Ce observați? Explicați. &lt;br /&gt;
&lt;br /&gt;
=== Căutarea unui caracter într-un șir de caractere === &lt;br /&gt;
Funcția folosită: strchr(); &lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;&lt;br /&gt;
int pozitie;&lt;br /&gt;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție. &lt;br /&gt;
*Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică. &lt;br /&gt;
*Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copierea unui șir de caractere  în altul === &lt;br /&gt;
Funcția folosită: strcpy (); &lt;br /&gt;
Sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcpy (destinatie, sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; șirul sursă se copiază în șirul destinație. Dacă lungimea șirului destinație este mai mică decât a șirului sursă, atunci copierea se face cu erori. Trebuie deci să punem următoarea condiție: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Concatenarea unor șiruri de caractere ===&lt;br /&gt;
Funcția folosită: srtcat();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];&lt;br /&gt;
strcat (destinatie, sursa); &lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să &amp;quot;încăpă&amp;quot; în șirul destinație. Matematic, asta se traduce astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
MAX_SIZE1 &amp;gt;= strlen (sursa) + strlen (destinatie); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Compararea  a doua șiruri de caractere ===&lt;br /&gt;
Funcția folosită: strcmp();&lt;br /&gt;
Sintaxa generala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];&lt;br /&gt;
int rezultat;&lt;br /&gt;
rezultat = strcmp (sir1, sir2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funcția strcmp(); întoarce următoarele valori: &lt;br /&gt;
* -1 dacă sir1 este înainte din punct de vedere alfabetic; &lt;br /&gt;
* 0 dacă cele două șiruri sunt identice; &lt;br /&gt;
* +1 dacă sir2 este înainte din punct de vedere alfabetic. &lt;br /&gt;
 &lt;br /&gt;
=== Inserția unui șir de caractere într-un alt șir === &lt;br /&gt;
Pentru această operație nu există o funcție specializată în biblioteca string.h. Ceea ce vom face va fi să folosim procedee învățate la vectori, cât și funcții menționate anterior. Etapele sunt următoarele: &lt;br /&gt;
* declarăm cele două șiruri; &lt;br /&gt;
* verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial; &lt;br /&gt;
* găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus; &lt;br /&gt;
* începând cu acea poziție, mutăm toate caracterele la dreaptă cu un număr de poziții egal cu lungimea șirului ce urmează să fie introdus; &lt;br /&gt;
* pe pozițiile rămase &amp;quot;goale&amp;quot; introducem șirul nou. &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu:&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
Transformați fraza &amp;quot;Studentul a picat examenul final.&amp;quot; în &amp;quot;Studentul nu a picat examenul final.&amp;quot; &lt;br /&gt;
Date necesare: sir_inițial[50] = &amp;quot;Sudentul a picat examenul final.&amp;quot;, sir_nou[3] = &amp;quot;nu &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
   char str1[10] = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
   char str2[10] = &amp;quot;World&amp;quot;;&lt;br /&gt;
   char str3[10];&lt;br /&gt;
   int  len ;&lt;br /&gt;
&lt;br /&gt;
   /* copiaza str1 in str3 */&lt;br /&gt;
   strcpy(str3, str1);&lt;br /&gt;
   printf(&amp;quot;strcpy( str3, str1) :  %s\n&amp;quot;, str3 );&lt;br /&gt;
&lt;br /&gt;
   /* concateneaza str1 str2 */&lt;br /&gt;
   strcat( str1, str2);&lt;br /&gt;
   printf(&amp;quot;strcat( str1, str2):   %s\n&amp;quot;, str1 );&lt;br /&gt;
&lt;br /&gt;
   /* lungimea str1 dupa concatenare */&lt;br /&gt;
   len = strlen(str1);&lt;br /&gt;
   printf(&amp;quot;strlen(str1) :  %d\n&amp;quot;, len );&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=3772</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=3772"/>
		<updated>2015-11-18T20:29:15Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixeli unui imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat este constant în timpul compilării. (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului=4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i=0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j=0; j &amp;lt; M; j++){&lt;br /&gt;
          // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,&amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j=0; j &amp;lt; 10; j++){&lt;br /&gt;
          printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;,&amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&lt;br /&gt;
#Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&lt;br /&gt;
#Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&lt;br /&gt;
#Declarați și afișați o matrice unitate.&lt;br /&gt;
#Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&lt;br /&gt;
#Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afiseze vectorul.&lt;br /&gt;
#Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
#*toate elementele situate pe diagonala principală sunt nule;&lt;br /&gt;
#*fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=3771</id>
		<title>PC Laborator 7</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=PC_Laborator_7&amp;diff=3771"/>
		<updated>2015-11-18T20:26:57Z</updated>

		<summary type="html">&lt;p&gt;Rdflorea: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Obiective ==&lt;br /&gt;
La încheierea acestui laborator studentul va fi capabil:&lt;br /&gt;
*să înteleagă modul de utilizare a tablourilor de memorie&lt;br /&gt;
*să declare şi să iniţializeze vectori/matrici&lt;br /&gt;
*să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme&lt;br /&gt;
&lt;br /&gt;
== Tablouri ==&lt;br /&gt;
 Tabloul de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.&lt;br /&gt;
Tablourile pot fi :&lt;br /&gt;
&lt;br /&gt;
*vectori (tablouri unidimensionale): șiruri de valori&lt;br /&gt;
*matrici (tablouri bidimensionale): catalogul cu note&lt;br /&gt;
*multidimensionale: pixeli unui imagini în timp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectori ===&lt;br /&gt;
&lt;br /&gt;
 Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii.&lt;br /&gt;
&lt;br /&gt;
====Declarația unei variabile de tip vector====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_vector&amp;gt;[&amp;lt;număr_maxim_elemente&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Exemplu=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */&lt;br /&gt;
float nume_vector[100]; /* vector de tip float cu 100 elemente */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Vectorii declarați astfel sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat este constant în timpul compilării. (număr_maxim_elemente fiind o constantă).&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
...&lt;br /&gt;
unsigned long nume_vector[MAX]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Recomandare: &amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Numărătoarea elementelor începe de la 0.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; int v[10]; // primul element va fi v[0],iar ultimul element v[9] &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Un alt mod de declarare este:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13};      // Toate elemente sunt initializate&lt;br /&gt;
float nume_vector[] = {1.2, 2.2, 6.1, -9.3};          // Compilatorul determina dimensiunea vectorului=4&lt;br /&gt;
int vect[1000] = {0, 1, 2, 3, 5};                     // Sunt initializate doar primele 5 elemente,restul fiind completate automat cu zero&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1].  A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i &amp;lt; N; i++)&lt;br /&gt;
// instrucțiune v[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi  int v[101];.&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modul de adresare ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Indici&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| Valoare&lt;br /&gt;
| 12&lt;br /&gt;
| 33&lt;br /&gt;
| 120&lt;br /&gt;
| 460&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v);     // v stochează adresa primul element&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,v[1]);  // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea vectorilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 int v[100], n, i; // vectorul a are maxim 100 de intregi &lt;br /&gt;
&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;n); // citeste nr de elemente &lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   scanf(&amp;quot;%d&amp;quot;, &amp;amp;v[i]); // citire elemente &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 for (i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
   printf(&amp;quot;%d &amp;quot;, v[i]); // scrie elemente &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matrici ===&lt;br /&gt;
&lt;br /&gt;
 O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane.&lt;br /&gt;
 Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039; Un vector este un caz particular de matrice cu o singură linie.&amp;#039;&amp;#039; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Declarația unei matrici ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_matrice&amp;gt;[&amp;lt;număr_linii&amp;gt;][&amp;lt;număr_coloane&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplul 1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți&lt;br /&gt;
&lt;br /&gt;
#define MAX 100&lt;br /&gt;
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int mat[N][M];&lt;br /&gt;
    for (int i=0; i &amp;lt; N; i++) {&lt;br /&gt;
        for (int j=0; j &amp;lt; M; j++){&lt;br /&gt;
          // instrucțiune mat[i][j];&lt;br /&gt;
    }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Observatie:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adresarea matricilor ====&lt;br /&gt;
&lt;br /&gt;
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;,&amp;amp;mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Citirea matricilor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int mat[10][10], i, j;&lt;br /&gt;
    for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
        for (j=0; j &amp;lt; 10; j++){&lt;br /&gt;
          printf(&amp;quot;v[%d][%d]=&amp;quot;, i, j);&lt;br /&gt;
           scanf(&amp;quot;%d&amp;quot;,&amp;amp;mat[i][j]);&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tablouri multidimensionale ===&lt;br /&gt;
&lt;br /&gt;
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tip_elemente&amp;gt; &amp;lt;nume_tablou&amp;gt;[&amp;lt;dim_1&amp;gt;][&amp;lt;dim_2&amp;gt;]...[&amp;lt;dim_n&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exemplu ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int cub[3][3][3];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.&lt;br /&gt;
&lt;br /&gt;
== Exerciții ==&lt;br /&gt;
&lt;br /&gt;
#Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.&lt;br /&gt;
#Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.&lt;br /&gt;
#Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.&lt;br /&gt;
#Declarați și afișați o matrice unitate.&lt;br /&gt;
#Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.&lt;br /&gt;
#Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afieseze vectorul.&lt;br /&gt;
#Scrieti un program care citeşte de la tastatură un număr natural, n (2≤n≤20), şi construieşte în memorie tabloul bidimensional cu n linii şi n coloane, având proprietătile:&lt;br /&gt;
#*toate elementele situate pe diagonala principală sunt nule;&lt;br /&gt;
#*fiecare linie contine, începând cu diagonala principală, de la dreapta la stânga, un şir strict crescător de numere consecutive, iar începând cu diagonala principală, de la stânga la dreapta, tot un şir strict crescător de numere consecutive.&lt;br /&gt;
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe&lt;br /&gt;
câte o linie a ecranului, cu elementele aflate pe aceeaşi linie separate prin&lt;br /&gt;
câte un spatiu.&lt;br /&gt;
Exemplu: dacă n=5 se afişează pe ecran tabloul alăturat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
0 1 2 3 4&lt;br /&gt;
1 0 1 2 3&lt;br /&gt;
2 1 0 1 2&lt;br /&gt;
3 2 1 0 1&lt;br /&gt;
4 3 2 1 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții pentru acasă==&lt;br /&gt;
&lt;br /&gt;
# Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.&lt;br /&gt;
# Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:&lt;br /&gt;
#* suma elementelor de pe diagonala principală&lt;br /&gt;
#* produsul elmentelor de pe diagonala secundară&lt;br /&gt;
#* minimul elementelor aflate deasupra, respectiv sub diagonala principală&lt;br /&gt;
# Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.&lt;br /&gt;
# Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2&amp;lt;n&amp;lt;25, 2&amp;lt;m&amp;lt;25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie. De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
2 3 4 5 6&lt;br /&gt;
3 4 5 6 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rdflorea</name></author>
	</entry>
</feed>