Oh mais il y a un verso !
This commit is contained in:
parent
92ffb7e562
commit
d4af7955e5
2
TP3/.gitignore
vendored
2
TP3/.gitignore
vendored
|
@ -1,2 +1,4 @@
|
||||||
alloc_statique
|
alloc_statique
|
||||||
alloc_dynamique
|
alloc_dynamique
|
||||||
|
chaine
|
||||||
|
realloc
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
all: $(patsubst %.c,%,$(shell ls *.c))
|
all: $(patsubst %.c,%,$(shell ls *.c))
|
||||||
|
|
||||||
%: %.c
|
%: %.c
|
||||||
clang -Wall -Wextra $< -o $@
|
clang -Wall -Wextra $< -o $@ -g
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
|
|
91
TP3/chaine.c
Normal file
91
TP3/chaine.c
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<ctype.h>
|
||||||
|
|
||||||
|
#define CHAINE_ALLOC_INCREMENT 8
|
||||||
|
|
||||||
|
// 3.1
|
||||||
|
typedef struct {
|
||||||
|
char* data;
|
||||||
|
int alloc;
|
||||||
|
int size;
|
||||||
|
} Chaine;
|
||||||
|
|
||||||
|
// 3.2
|
||||||
|
void init_chaine(Chaine* chaine) {
|
||||||
|
chaine->data = NULL;
|
||||||
|
chaine->alloc = 0;
|
||||||
|
chaine->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.3
|
||||||
|
void clean_chaine(Chaine* chaine) {
|
||||||
|
free(chaine->data);
|
||||||
|
// On remet tout à zéro au cas où quelqu'un veuille réutiliser la chaine
|
||||||
|
// qu'il n'essaye pas d'accéder à des emplacement mémoire inexistants
|
||||||
|
init_chaine(chaine);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.4
|
||||||
|
void print_chaine(Chaine* chaine) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < chaine->size; i++) {
|
||||||
|
putchar(chaine->data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.5
|
||||||
|
void concat_chaine_char(Chaine* chaine, char c) {
|
||||||
|
chaine->size++;
|
||||||
|
if (chaine->size > chaine->alloc) {
|
||||||
|
chaine->alloc += CHAINE_ALLOC_INCREMENT;
|
||||||
|
chaine->data = realloc(chaine->data, chaine->alloc * sizeof(char));
|
||||||
|
}
|
||||||
|
chaine->data[chaine->size-1] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.7
|
||||||
|
void concat_chaine_chaine(Chaine* ch1, Chaine* ch2) {
|
||||||
|
if (ch1->size + ch2->size > ch1->alloc) {
|
||||||
|
ch1->alloc = ch1->size + ch2->size;
|
||||||
|
ch1->data = realloc(ch1->data, ch1->alloc * sizeof(char));
|
||||||
|
}
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < ch2->size; i++) {
|
||||||
|
ch1->data[ch1->size+i] = ch2->data[i];
|
||||||
|
}
|
||||||
|
ch1->size += ch2->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remarque : Ici le '\0' n'est pas géré, et on a size <= alloc
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// 3.6
|
||||||
|
Chaine chaine;
|
||||||
|
init_chaine(&chaine);
|
||||||
|
char c;
|
||||||
|
c = getchar();
|
||||||
|
while (! isspace(c)) {
|
||||||
|
concat_chaine_char(&chaine, c);
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
print_chaine(&chaine);
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
// 3.7
|
||||||
|
Chaine chaine2;
|
||||||
|
init_chaine(&chaine2);
|
||||||
|
c = getchar();
|
||||||
|
while (! isspace(c)) {
|
||||||
|
concat_chaine_char(&chaine2, c);
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
concat_chaine_chaine(&chaine, &chaine2);
|
||||||
|
print_chaine(&chaine);
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
clean_chaine(&chaine);
|
||||||
|
clean_chaine(&chaine2);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
66
TP3/realloc.c
Normal file
66
TP3/realloc.c
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
// 2.2.1 isspace vérifie si son argument est un caractère d'espacement
|
||||||
|
// Elle est responsable du fait que le programme n'imprime que le premier mot envoyé
|
||||||
|
|
||||||
|
// 2.2.2
|
||||||
|
int main() {
|
||||||
|
int i, taille_chaine = 1, taille_vect = 16;
|
||||||
|
char *chaine = malloc(taille_vect * sizeof(char));
|
||||||
|
char *chaine_temp;
|
||||||
|
char c;
|
||||||
|
c = getchar();
|
||||||
|
|
||||||
|
while (! isspace(c)) {
|
||||||
|
taille_chaine++;
|
||||||
|
if (taille_chaine > taille_vect) {
|
||||||
|
taille_vect += 8;
|
||||||
|
chaine_temp = malloc(taille_vect * sizeof(char));
|
||||||
|
for (i = 0; i < taille_chaine; i++) {
|
||||||
|
chaine_temp[i] = chaine[i];
|
||||||
|
}
|
||||||
|
free(chaine);
|
||||||
|
chaine = chaine_temp;
|
||||||
|
}
|
||||||
|
chaine[taille_chaine-1] = c;
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < taille_chaine; i++) {
|
||||||
|
putchar(chaine[i]);
|
||||||
|
}
|
||||||
|
free(chaine);
|
||||||
|
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.2.4
|
||||||
|
int main4() {
|
||||||
|
int i, taille_chaine = 1, taille_vect = 16;
|
||||||
|
char *chaine = malloc(taille_vect * sizeof(char));
|
||||||
|
char c;
|
||||||
|
c = getchar();
|
||||||
|
|
||||||
|
while (! isspace(c)) {
|
||||||
|
taille_chaine++;
|
||||||
|
if (taille_chaine > taille_vect) {
|
||||||
|
taille_vect += 8;
|
||||||
|
chaine = realloc(chaine, taille_vect * sizeof(char));
|
||||||
|
}
|
||||||
|
chaine[taille_chaine-1] = c;
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < taille_chaine; i++) {
|
||||||
|
putchar(chaine[i]);
|
||||||
|
}
|
||||||
|
free(chaine);
|
||||||
|
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in a new issue