Solution des exercices du laboratoire 1

Sommaire

Unix et ligne de commande

#!/bin/bash

#Question 1
ls -l | grep .txt | wc -l > f1
# Les extensions ne sont pas un moyen fiable pour identifier des fichiers, préférer la commande file
# par exemple (peut être amélioré!)
file -i * | grep 'text/plain' | wc -l > f1

#Question 2
head -5 /etc/hosts | tail -1
# ou
tail -n +5 /etc/hosts | head -n 1

#Question 3
ln -s /bin/sh toto

#Question 4
#chmod 777 --> utilisateur: rwx, groupe: rwx, autres: rwx
#chmod 640 --> utilisateur: rw-, groupe: r--, autres: ---
#chmod 005 --> utilisateur: ---, groupe: ---, autres: r-x

#Question 5
#1
ls -1 /etc/c*
#2
find /etc -maxdepth 2 -name "c*" 2> /dev/null
#3
grep "^c" /usr/share/dict/words

Programmation C

Exercice 1

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

#define TAILLE_MAX 400

int main(){
	char *tab_pointeurs[6], phrase_saisie[TAILLE_MAX];
	int i;
	FILE *file;

	//ouverture du fichier où on va enregistrer
	file = fopen("enregistrement.txt", "w");
	if(!file){
		perror("enregistrement.txt");
		return 1;
	}

	for(i=0; i<6; i++){
		//saisir les phrases
		printf("Saisir la phrase %d: ", i+1);
		fgets(phrase_saisie, TAILLE_MAX, stdin);
		//allouer de l'espace mémoire sur mesure
		int len = strlen(phrase_saisie) + 1;
		tab_pointeurs[i] = malloc(len); // +1 parce que le '\0' final
		// Gestion d'éventuelles erreurs lors de l'allocation
		if (tab_pointeurs[i] == NULL) {
			perror("Allocation");
			if (i % 2 != 0) {
				free(tab_pointeurs[i-1]);
			}
			return 1;
		}
		//copier la phrase dans le vecteur alloué
		strncpy(tab_pointeurs[i], phrase_saisie, len);
		if(i%2 != 0){
			//écrire dans le fichier et ensuite libérer l'espace
			fprintf(file, "%s%s", tab_pointeurs[i-1], tab_pointeurs[i]);
			free(tab_pointeurs[i-1]);
			free(tab_pointeurs[i]);
		}
	}

	fclose(file);

}

Exercice 2

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

#define TAILLE_MAX 50

int main(int argc, char *argv[]){

	FILE *file;
	char phrase[TAILLE_MAX], **tableau_lignes = NULL, *phrase_tmp;
	int nb_lignes = 0, i, j;

	if (argc != 2) {
		fprintf(stderr, "Vous devez fournir un fichier en argument");
		return 1;
	}

	//ouverture du fichier passé en paramètre au programme en mode lecture
	file = fopen(argv[1], "r");
	if(!file){
		perror(argv[1]);
		return 1;
	}

	//lire le fichier et allouer l'espace mémoire pour chaque phrase
	while(fgets(phrase, TAILLE_MAX, file) != NULL){
		tableau_lignes = realloc(tableau_lignes, sizeof(*tableau_lignes)*(nb_lignes + 1));
	    *(tableau_lignes + nb_lignes) = malloc(sizeof(char)*strlen(phrase) + 1); // tableau_lignes[nb_lignes]
		if (tableau_lignes[nb_lignes] == NULL) {
			perror("Allocation");
			// Libérer l'espace des phrases précédentes
			for(i = 0; i < nb_lignes; i++){
				free(tableau_lignes[i]);
			}
			free(tableau_lignes);
			return 1;
		}
	    strcpy(*(tableau_lignes + nb_lignes), phrase);
	    nb_lignes++;
	}


	//trier les phrases lexicographiquement
	for (i=0 ; i < nb_lignes-1; i++)
	{
		for (j=0 ; j < nb_lignes-i-1; j++)
		{
		   if (strcmp(tableau_lignes[j], tableau_lignes[j+1]) > 0)
		   {
		      phrase_tmp = tableau_lignes[j];
		      tableau_lignes[j] = tableau_lignes[j+1];
		      tableau_lignes[j+1] = phrase_tmp;
		   }
		}
	}

	//afficher le résultat
	for(i=0; i<nb_lignes; i++){
		printf("%s", tableau_lignes[i]);
		free(tableau_lignes[i]);
	}
	free(tableau_lignes);

	//fermeture du fichier
	fclose(file);

}