/*
* Problema 1
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c = 'a', *p, s[100];
p = &c;
printf("%c %c %c", *p, *p + 1, *p + 2);
s[0] = 'A';
s[1] = 'B';
s[2] = 'C';
s[3] = '\0';
p = s;
printf("\n%s %s %c %s", s, p, *(p + 1), p + 1);
strcpy(s, "\nacesta este un exemplu de lucru cu pointeri");
printf("%s", s);
p += 17;
for (; *p != '\0'; ++p) {
if (*p == 'e')
*p = 'E';
if (*p == ' ')
*p = '\n';
}
printf("%s\n", s);
return 0;
}
/*
* Problema 2
*
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void *my_realloc(void *p, int n)
{
void *x;
x = malloc(n);
memcpy(x, p, n);
free(p);
return x;
}
int main()
{
char *p;
p = (char *) malloc(sizeof(char) * 5);
strcpy(p, "abcd");
p = (char *) my_realloc(p, 20);
strcat(p, "cioco");
printf("%s", p);
return 0;
}
/*
* Problema 3
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *my_strdup(char *s)
{
char *p = (char *) malloc(strlen(s) + 1);
strcpy(p, s);
return p;
}
int main()
{
char buf[512];
char *p;
scanf("%s", buf);
p = my_strdup(buf);
printf("%s", p);
return 0;
}
/*
* Problema 4
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *my_replace(char *s, char *s1, char *s2)
{
/*in vectorul auxiliar se aloca memorie(din sirul total se scaote sirul care trebuie inlocuit
si se aduaga dimensiunea sirului cu care este inlocuit */
char *aux = (char *) malloc((sizeof(s) - sizeof(s1)) + sizeof(s2) + 1);
int i = strstr(s, s1) - s, j = strlen(s1);
strncpy(aux, s, i);
strcat(aux, s2);
strncat(aux, (s + i + j), (strlen(s) - i - j));
return aux;
}
int main()
{
char *s, *s1, *s2;
s = malloc(10);
s1 = malloc(10);
s2 = malloc(10);
char *aux;
scanf("%s%s%s", s, s1, s2);
aux = my_replace(s, s1, s2);
printf("%s\n", aux);
return 0;
}
/*
* Problema 5
*
*/
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int n, i;
char (*cuvinte_u)[20] = NULL, (*cuvinte)[20]; // un pointer la un sir de 20 caractere
int *aparitii;
scanf("%d\n", &n);
cuvinte = (char (*)[20]) malloc(n * sizeof(char[20]));
i = 0;
while (i < n) {
scanf("%s", cuvinte[i]);
i++;
}
int dim = 4, unice = 0, k;
cuvinte_u = (char (*)[20]) malloc(dim * sizeof(char[20]));
aparitii = (int *) malloc(dim * sizeof(int));
for (i = 0; i < n; i++) {
int found = 0; // variabila care va indica daca am gasit cuvantul in vectorul de aparitii unice
for (k = 0; k < unice; k++) {
if (strcmp(cuvinte_u[k], cuvinte[i]) == 0) {
aparitii[k]++;
found = 1;
}
}
if (found != 1) { //in cazul in care vucantul nu a fost gasit in vectorul de valori unice
if (unice >= dim) { //in cazul in care dimensiunea vectorului unic nu a ajuns la limita
dim *= 2;
aparitii = (int *) realloc(aparitii, dim * sizeof(int));
cuvinte_u = (char (*)[20]) realloc(cuvinte_u, dim * sizeof(char[20]));
}
strcpy(cuvinte_u[unice], cuvinte[i]);
aparitii[unice] = 1;
unice++;
}
}
for (i = 0; i < unice; i++) { //afisarea rezultatelor
printf("%s %d\n", cuvinte_u[i], aparitii[i]);
}
//dealocare de memorie
free(aparitii);
free(cuvinte_u);
free(cuvinte);
return 0;
}
/*
* Problema 6
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char cuvant[20];
char **interclaseaza(int n1, cuvant *s1, int n2, cuvant *s2)
{
char **x = (char **) malloc (sizeof(char *) * (n1 + n2));
// nu alocam memorie pentru siruri => sizeof(char *), nu sizeof(cuvant)
int k = 0, j, i;
for (i = 0, j = 0; i < n1 && j < n2; )
if (strcmp(s1[i], s2[j]) <= 0)
x[k++] = s1[i++];
else
x[k++] = s2[j++];
while (i < n1)
x[k++] = s2[i++];
while (j < n2)
x[k++] = s1[j++];
return x;
}
int main()
{
int n1 = 10, n2 = 10, i;
char **x;
cuvant *s1 = malloc(sizeof(cuvant) * n1);
cuvant *s2 = malloc(sizeof(cuvant) * n2);
for (i = 0; i < 10; i++) {
sprintf(s1[i], "%d", i);
sprintf(s2[i], "%d", i);
}
x = interclaseaza(n1, s1, n2, s2);
for (i = 0; i < n1; i++)
printf("%s ", s1[i]);
printf("\n");
for (i = 0; i < n2; i++)
printf("%s ", s2[i]);
printf("\n");
for (i = 0; i < n1 + n2; i++)
printf("%s ", x[i]);
printf("\n");
free(s1);
free(s2);
free(x);
return 0;
}