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