PC Laborator 8: Diferență între versiuni

De la WikiLabs
(Observație: strlen vs sizeof)
(Compararea a doua șiruri de caractere)
(Nu s-au afișat 31 de versiuni intermediare efectuate de alți 5 utilizatori)
Linia 6: Linia 6:
  
 
== Șiruri de caractere ==  
 
== Șiruri de caractere ==  
 
+
 
 +
[[Fișier:ascii_table.jpg|thumb]]
 +
 
 
Î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).  
 
Î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).  
 
Declararea unui șir de caractere se face astfel:  
 
Declararea unui șir de caractere se face astfel:  
Linia 23: Linia 25:
 
=== Aflarea lungimii unui șir de caractere ===  
 
=== Aflarea lungimii unui șir de caractere ===  
 
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.  
 
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.  
<div class="regula"> ''' Observație: ''' Caracterul '\0' nu este caracter util în lungime, deci el nu este contorizat și nici numărat.
+
<div class="regula"> ''' Observație: ''' Caracterul '\0' marchează sfârșitul șirului, iar acolo se oprește numărarea.
 
</div>
 
</div>
 
Sintaxa generala:
 
Sintaxa generala:
Linia 33: Linia 35:
 
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere.  
 
Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere.  
  
1. Sintaxa generala:
+
1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
char sir_de_caractere[MAX_SIZE];
 
char sir_de_caractere[MAX_SIZE];
 
int i;
 
int i;
 
for (i = 0; i < MAX_SIZE; i++) {
 
for (i = 0; i < MAX_SIZE; i++) {
scanf ("%c", &sir_de_caractere [i]);
+
    scanf ("%c", &sir_de_caractere[i]);
 +
    /* 10 este codul ascii pentru \n, adica enter */
 +
    if (sir_de_caractere[i] == 10) {
 +
        sir_de_caractere[i] = '\0';
 +
        break;
 +
    }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
2. Sintaxa generala
+
 
 +
2. Se folosește <code>scanf</code> cu template-ul <code>%s</code> (atenție, acest <code>scanf</code> va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
char sir_de_caractere[MAX_SIZE];
 
char sir_de_caractere[MAX_SIZE];
 
scanf ("%s", sir_de_caractere);
 
scanf ("%s", sir_de_caractere);
 
</syntaxhighlight>
 
</syntaxhighlight>
3. Sintaxa generala:
+
 
 +
3. Se folosește <code>scanf</code> cu template-ul <code>%[^\n]</code> (atenție, acest <code>scanf</code> va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de <code>getchar()</code>):
 +
<syntaxhighlight lang="C">
 +
char sir_de_caractere[MAX_SIZE];
 +
scanf ("%[^\n]", sir_de_caractere);
 +
getchar();
 +
</syntaxhighlight>
 +
 
 +
4. Se folosește <code>fgets</code> (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
char sir_de_caractere[MAX_SIZE];
 
char sir_de_caractere[MAX_SIZE];
gets(sir_de_caractere);
+
fgets(sir_de_caractere, MAX_SIZE, stdin);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
=== Afișarea unui șir de caractere ===  
 
=== Afișarea unui șir de caractere ===  
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:
+
Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:
 +
 
 
1. Sintaxa generala:
 
1. Sintaxa generala:
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
char sir_de_caractere[MAX_SIZE];
+
char sir_de_caractere[MAX_SIZE];  
 +
scanf("%s",sir_de_caractere); // citire sir de caractere
 +
 
 
int i;
 
int i;
for (i = 0; i < MAX_SIZE; i++) {
+
for (i = 0; i < MAX_SIZE && sir_de_caractere [i] != '\0'; i++) {
printf ("%c", &sir_de_caractere [i]);
+
    printf ("%c", sir_de_caractere [i]);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
2. Sintaxa generala
 
2. Sintaxa generala
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
char sir_de_caractere[MAX_SIZE];
 
 
printf ("%s", sir_de_caractere);
 
printf ("%s", sir_de_caractere);
 
</syntaxhighlight>
 
</syntaxhighlight>
 
3. Sintaxa generala:
 
3. Sintaxa generala:
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
char sir_de_caractere[MAX_SIZE];
 
 
puts(sir_de_caractere);
 
puts(sir_de_caractere);
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
'''Exemplu''': 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.
 
'''Exemplu''': 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.
  
Linia 82: Linia 99:
 
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;
 
char sir_de_caractere[MAX_SIZE], char caracterul_cautat;
 
int pozitie;
 
int pozitie;
pozitie = strchr (sir_de_caractere, caracterul_cautat) - sir_de_caractere;
+
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;
 
</syntaxhighlight>
 
</syntaxhighlight>
 
<div class="regula"> ''' Observație: ''' Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție.  
 
<div class="regula"> ''' Observație: ''' Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție.  
Linia 94: Linia 111:
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
 
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
strcpy (destinatie, sursa);
+
strcpy(destinatie, sursa);
 
</syntaxhighlight>
 
</syntaxhighlight>
 
<div class="regula"> ''' Observație: ''' ș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:  
 
<div class="regula"> ''' Observație: ''' ș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:  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
MAX_SIZE1 >= strlen (sursa);
+
MAX_SIZE1 >= strlen(sursa);
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Linia 105: Linia 122:
 
Funcția folosită: srtcat();
 
Funcția folosită: srtcat();
 
Sintaxa generala:
 
Sintaxa generala:
 +
<syntaxhighlight lang="C">
 
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
 
char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
strcat (destinatie, sursa);  
+
strcat(destinatie, sursa);  
 +
</syntaxhighlight>
 
<div class="regula"> ''' Observație: ''' Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să "încăpă" în șirul destinație. Matematic, asta se traduce astfel:  
 
<div class="regula"> ''' Observație: ''' Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să "încăpă" în șirul destinație. Matematic, asta se traduce astfel:  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
MAX_SIZE1 >= strlen (sursa) + strlen (destinatie);  
+
MAX_SIZE1 >= strlen(sursa) + strlen(destinatie);  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Linia 119: Linia 138:
 
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];
 
char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];
 
int rezultat;
 
int rezultat;
rezultat = strcmp (sir1, sir2);
+
rezultat = strcmp(sir1, sir2);
 
</syntaxhighlight>
 
</syntaxhighlight>
 
Funcția strcmp(); întoarce următoarele valori:  
 
Funcția strcmp(); întoarce următoarele valori:  
* -1 dacă sir1 este înainte din punct de vedere alfabetic;  
+
* un număr negativ - dacă sir1 este înainte din punct de vedere alfabetic;  
* 0 dacă cele două șiruri sunt identice;  
+
* 0 - dacă cele două șiruri sunt identice;  
* +1 dacă sir2 este înainte din punct de vedere alfabetic.  
+
* un număr pozitiv - dacă sir2 este înainte din punct de vedere alfabetic.
+
 
 
=== Inserția unui șir de caractere într-un alt șir ===  
 
=== Inserția unui șir de caractere într-un alt șir ===  
 
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:  
 
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:  
Linia 150: Linia 169:
 
int len,size;
 
int len,size;
  
len=strlen(str1);
+
len = strlen(str1);
size=sizeof(str1);  
+
size = sizeof(str1);  
 
printf("Lungimea str1: %d\n", len);
 
printf("Lungimea str1: %d\n", len);
 
printf("Lungimea total alocata str1: %d\n", size);
 
printf("Lungimea total alocata str1: %d\n", size);
Linia 160: Linia 179:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Observație ===
+
=== strchr vs strrchr ===
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
#include <stdio.h>
 
#include <stdio.h>
Linia 166: Linia 185:
 
int main()
 
int main()
 
{
 
{
     char str1[40] = "Cautare de caracter";
+
     char str1[40] = "Cautare de caracter printre caractere";
 
     printf ("Caz1: %s\n", strchr(str1, 'a'));
 
     printf ("Caz1: %s\n", strchr(str1, 'a'));
 
     printf ("Caz2: %s\n", strrchr(str1, 'a'));
 
     printf ("Caz2: %s\n", strrchr(str1, 'a'));
 +
        printf ("Caz3: %s\n", strstr(str1, "de"));
  
 
     return 0;
 
     return 0;
Linia 204: Linia 224:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Exemple gets/puts ===
+
=== Model de concatenare fără a utiliza strcat ===
 +
<syntaxhighlight lang="C">
 +
#include <stdio.h>
 +
#include <string.h>
 +
 
 +
int main(){
 +
 
 +
  char str1[10], str2[10], str3[20];
 +
  int i, poz;
 +
  printf("Introduceti sir1: ");
 +
  scanf("%s",str1);
 +
  printf("Introduceti sir2: ");
 +
  scanf("%s",str2);
 +
 
 +
for (i = 0; i < strlen(str1); i++)
 +
str3[i] = str1[i];
 +
poz=i;
 +
for (i = 0; i < strlen(str2); i++)
 +
str3[poz+i] = str2[i];
 +
str3[poz+i] ='\0';
 +
 
 +
  printf("Sir concatenat: %s\n",str3);
 +
 
 +
return 0;
 +
}
 +
</syntaxhighlight>
 +
 
 +
=== Exemple fgets & puts ===
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
  
Linia 213: Linia 260:
 
     printf("Numele este: ");
 
     printf("Numele este: ");
 
   /* Citește string de la utilizator */
 
   /* Citește string de la utilizator */
     gets(name);     
+
     fgets(nume, 30, stdin);     
 
     printf("Nume: ");
 
     printf("Nume: ");
 
   /* Afișează string */
 
   /* Afișează string */
Linia 223: Linia 270:
 
== Exerciții ==
 
== Exerciții ==
  
 +
#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.
 
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.
 
#Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.
 
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.
 
#Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.
 +
#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ă.

Versiunea de la data 23 noiembrie 2016 20:59

Obiective

în urma acestui laborator, studentul va fi capabil să:

  • înțeleagă cum funcționează șirurile de caractere
  • facă operații cu șiruri de caractere

Șiruri de caractere

Ascii table.jpg

Î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). Declararea unui șir de caractere se face astfel:

char numele_sirului [numarul_de_caractere];
Observație: 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.

Operații cu șiruri

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.

Observație: 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.

Aflarea lungimii unui șir de caractere

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.

Observație: Caracterul '\0' marchează sfârșitul șirului, iar acolo se oprește numărarea.

Sintaxa generala:

lungime_sir = strlen (sir_de_caractere);

Citirea unui șir de caractere

Există mai multe variante pentru a citi un șir de caractere, unele asemănătoare vectorilor, altele specifice șirurilor de caractere.

1. Citirea șirului caracter cu caracter, până la întâlnirea caracterului cu codul ASCII 10 (newline - \n), moment în care se scrie caracterul de sfârșit de șir (null terminator - \0):

char sir_de_caractere[MAX_SIZE];
int i;
for (i = 0; i < MAX_SIZE; i++) {
    scanf ("%c", &sir_de_caractere[i]);
    /* 10 este codul ascii pentru \n, adica enter */
    if (sir_de_caractere[i] == 10) {
        sir_de_caractere[i] = '\0';
        break;
    }
}

2. Se folosește scanf cu template-ul %s (atenție, acest scanf va citi exclusiv până la primul caracter alb - spațiu, tab sau newline):

char sir_de_caractere[MAX_SIZE];
scanf ("%s", sir_de_caractere);

3. Se folosește scanf cu template-ul %[^\n] (atenție, acest scanf va citi exclusiv până la primul newline pe care nu îl va consuma din stream - acesta va trebui eliminat manual cu apel de getchar()):

char sir_de_caractere[MAX_SIZE];
scanf ("%[^\n]", sir_de_caractere);
getchar();

4. Se folosește fgets (atenție, acestă funcție va citi maxim MAX_SIZE - 1 caractere de la tastatură, sau până la întâlnirea lui \n, în care situație caracterul \n va fi adăugat în șir):

char sir_de_caractere[MAX_SIZE];
fgets(sir_de_caractere, MAX_SIZE, stdin);

Afișarea unui șir de caractere

Analog citirii unui șir de caractere, afișarea se poate face și ea în mai multe moduri, după cum urmează:

1. Sintaxa generala:

char sir_de_caractere[MAX_SIZE]; 
scanf("%s",sir_de_caractere); // citire sir de caractere

int i;
for (i = 0; i < MAX_SIZE && sir_de_caractere [i] != '\0'; i++) {
    printf ("%c", sir_de_caractere [i]);
}

2. Sintaxa generala

printf ("%s", sir_de_caractere);

3. Sintaxa generala:

puts(sir_de_caractere);

Exemplu: 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.

Căutarea unui caracter într-un șir de caractere

Funcția folosită: strchr(); Sintaxa generala:

char sir_de_caractere[MAX_SIZE], char caracterul_cautat;
int pozitie;
pozitie = strchr(sir_de_caractere, caracterul_cautat) - sir_de_caractere;
Observație: Funcția strchr NU oferă toate pozițiile pe care se află caracterul_căutat, ci doar prima poziție.
  • Pentru a afla ultima poziție pe care se află un caracter căutat, se va folosi funcția strrchr(), sintaxa fiind identică.
  • Pentru a caută un șir de caractere într-un alt șir de caractere, se va folosi funcția strstr(), sintaxa fiind aceeași.

Copierea unui șir de caractere în altul

Funcția folosită: strcpy (); Sintaxa:

char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
strcpy(destinatie, sursa);
Observație: ș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:
MAX_SIZE1 >= strlen(sursa);

Concatenarea unor șiruri de caractere

Funcția folosită: srtcat(); Sintaxa generala:

char destinatie[MAX_SIZE1], sursa[MAX_SIZE2];
strcat(destinatie, sursa);
Observație: Concatenarea se face adăugând șirul sursă la șirul destinație. Este deci necesar ca șirul sursă să "încăpă" în șirul destinație. Matematic, asta se traduce astfel:
MAX_SIZE1 >= strlen(sursa) + strlen(destinatie);

Compararea a doua șiruri de caractere

Funcția folosită: strcmp(); Sintaxa generala:

char sir1 [MAX_SIZE1], sir2 [MAX_SIZE2];
int rezultat;
rezultat = strcmp(sir1, sir2);

Funcția strcmp(); întoarce următoarele valori:

  • un număr negativ - dacă sir1 este înainte din punct de vedere alfabetic;
  • 0 - dacă cele două șiruri sunt identice;
  • un număr pozitiv - dacă sir2 este înainte din punct de vedere alfabetic.

Inserția unui șir de caractere într-un alt șir

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:

  • declarăm cele două șiruri;
  • verificăm dacă șirul ce urmează să fie introdus încape în șirul inițial;
  • găsim poziția unde dorim să adăugăm șirul ce urmează să fie introdus;
  • î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;
  • pe pozițiile rămase "goale" introducem șirul nou.

Exemplu: Transformați fraza "Studentul a picat examenul final." în "Studentul nu a picat examenul final." Date necesare: sir_inițial[50] = "Sudentul a picat examenul final.", sir_nou[3] = "nu ".


Observații și exemple

strlen vs sizeof

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "StringLab";
	int len,size;

	len = strlen(str1);
	size = sizeof(str1); 
	printf("Lungimea str1: %d\n", len);
	printf("Lungimea total alocata str1: %d\n", size);

     return 0;
}

strchr vs strrchr

#include <stdio.h>
#include <string.h>
int main()
{
    	char str1[40] = "Cautare de caracter printre caractere";
    	printf ("Caz1: %s\n", strchr(str1, 'a'));
    	printf ("Caz2: %s\n", strrchr(str1, 'a'));
        printf ("Caz3: %s\n", strstr(str1, "de"));

     return 0;
}

Exemple operații cu șiruri

#include <stdio.h>
#include <string.h>

int main () {

   char str1[10] = "Hello";
   char str2[10] = "String Lab";
   char str3[10];
   int  len ;

   /* copiaza str1 in str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );

   /* concateneaza str1 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );

   /* lungimea str1 dupa concatenare */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );

   return 0;
}

Model de concatenare fără a utiliza strcat

#include <stdio.h>
#include <string.h>

int main(){

   char str1[10], str2[10], str3[20];
   int i, poz;
   printf("Introduceti sir1: ");
   scanf("%s",str1);
   printf("Introduceti sir2: ");
   scanf("%s",str2);

	for (i = 0; i < strlen(str1); i++)
		str3[i] = str1[i];
		poz=i;
	for (i = 0; i < strlen(str2); i++)
		str3[poz+i] = str2[i];
		str3[poz+i] ='\0';

   printf("Sir concatenat: %s\n",str3); 

return 0;
}

Exemple fgets & puts

#include <stdio.h>
#include <string.h>
int main(){
    char nume[30];
    printf("Numele este: ");
   /* Citește string de la utilizator */
    fgets(nume, 30, stdin);     
    printf("Nume: ");
   /* Afișează string */
    puts(nume);    
    return 0;
}

Exerciții

  1. 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.
  2. Să se scrie un program care șterge toate caracterele dintr-o linie citită de la tastatură cu excepția literelor.
  3. Să se scrie un program care afișează pe ecran frecvența de apariție a unui caracter citit de la tastatură.
  4. 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ă.