This repository has been archived on 2019-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
s6-pa-tp/TP3/chaine.c

92 lines
1.9 KiB
C

#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;
}