11–1

Écrivez une fonction que vous nommerez "reponse" acceptant une chaîne de caractères en argument. Cette fonction retourne 1 si cette chaîne contient une variante d'une réponse affirmative: "oui", "ouais", "si", "ok". Elle retourne -1 si la chaîne contient une variante d'une réponse négative: "non", "no", "niet", "nah". Elle retourne finalement 0 si la chaîne ne contient ni l'une ni l'autre réponse. NOTE: La variante du "oui" comme celle du "non" peut apparaître n'importe où dans la chaîne. Et c'est uniquement la première occurence d'une des variantes qui détermine le résultat final. Ainsi, lorsque la chaîne contient: "non je pense que oui", c'est le "non" qui l'emporte.

A) Tentez de résoudre le problème en utilisant AUCUNE fonction de la librairie STRING.H.
B) Tentez de résoudre le problème en utilisant UNIQUEMENT la fonction "strtok" et "strcmp" (ou "strcmpi").
C) La fonction "strstr" possède le prototype suivant: char * strstr(const char * s, const char * sousch). Cette fonction permet de savoir si la chaîne "sousch" apparaît quelque part dans la chaîne "s". Lorsque c'est le cas, la fonction retourne un pointeur sur la première occurence de "sousch" dans "s", sinon, la fonction retourne NULL. La fonction "strupr" permet quant à elle de transformer les caractères d'une chaîne "s" en majuscules. Son prototype est: char * strupr(char * s). Sachant cela, tentez de résoudre le problème en utlisant la fonction "strstr" et "strupr".
D) Étant donné que le mot représentant une variante donnée peut apparaître n'importe où dans la chaîne fournie mais n'est pas considérée si le mot apparaît à l'intérieur d'un autre (exemple: le "si" dans "simulitude" ne doit pas compter comme une variante d'un "oui"), quelle version parmi les trois précédentes trouvez-vous la plus sécuritaire?
11–2

Utilisez la fonction précédente dans un programme afin de compter combien de réponses négatives et positives ont été fournies dans un texte où chaque ligne est considérée comme une réponse complète. Ainsi pour le texte suivant:

Les gens sont d'accord pour dire non à cette proposition
stupide qui dit oui à l'imbécilité et à la non responsabilité.
D'un seul souffle, le citoyen dira niet, assez, basta.
Et tous, une fois encore, comme des moutons idiots
ils diront ok à l'idiotie.
Mais seulement et seulement si, tous se battent
ensemble dans leur simulitude.

le programme afficherait: 3 variantes du "oui" et 2 variantes du "non".

11–3 Écrivez vous-même la fonction "strupr" recevant une chaîne de caractères en argument et transformant les caractères de cette chaîne en majuscules. La fonction retourne un pointeur sur la chaîne transformée.
11–4

Examinez la définition de la fonction suivante. Pouvez-vous décrire en français la tâche réalisée par cette fonction? Voyez-vous une contradiction entre la déclaration au niveau de la paramétrisation et l'utilisation de ces mêmes paramètres dans le corps de la fonction? Corrigez les incongruités en modifiant la paramétrisation.

char * mystere(const char * s1, char * s2, int n){
   int i;
if (n > strlen(s2)) n = strlen(s2);
i = 0;
while (i < n && s1[i] != '\0') {
s1[i] = s2[i];
i++;
}
return s1; }
11–5 Écrivez deux versions d'une fonction recevant une chaîne de caractères en argument et retournant 1 si la chaîne est un palindrome. La fonction retourne 0 dans le cas contraire.
  A) Dans cette version, tous les caractères sont significatifs. Ainsi la chaîne LAVAL est un palindrome de même que ELUPARCETTECRAPULE. Par contre, la chaîne "ELU PAR CETTE CRAPULE" n'est pas un palindrome car les espaces invalident le résultat.
B) Dans cette version, les caractères non significatifs (tous les caractères de ponctuation) ne sont pas considérés. Utilisez la fonction "ispunct" de la librairie "ctype.h" pour effectuer le test.
11–6

Écrivez une fonction dont le prototype est:

char * remplaceCar(char * s, int c1, int c2);

permettant de remplacer toutes les occurences du caractère c1 par le caractère c2.

11–7

Écrivez une fonction dont le prototype est:

char * enleveCar(char * s, int c1);

permettant d'enlever toutes les occurences du caractère c1 dans la chaîne "s". ATTENTION: la chaîne peut donc raccourcir.

11–8

Écrivez une fonction dont le prototype est:

char * enleveStr(char * s1, const char * s2);

permettant d'enlever toutes les occurences de la chaîne s2 dans la chaîne s1. ATTENTION: la chaîne peut donc raccourcir.

11–9

Écrivez une fonction dont le prototype est:

char * remplaceStr(char * s1, const char * s2, const char * s3);

permettant de remplacer toutes les occurences de la chaîne s2 dans la chaîne s1 par s3. ATTENTION: la chaîne peut donc raccourcir.

11–10

Tests de compréhension sur "strtok". Considérez la déclaration suivante:

char ligne[60];

Après une lecture, ce tableau contient la chaîne de caractères:

"VOICI, DANS LEUR SPLENDEUR(!), LES 1,800 CRAPULES!?"

Les questions qui suivent utilisent la fonction "strtok" sur cette chaîne de départ.

A)

Considérez la déclaration suivante:

char * SEP = ", ()!?.";  // l'espace est inclus.

Dessinez le contenu complet du tableau "ligne" (ses 60 emplacements) après la boucle suivante et indiquez ce qui sera affiché par ce bout de code.

char * p;
p = strtok(ligne, SEP);
while (p) {
puts(p);
p = strtok(NULL, SEP); }
B)

Considérez la déclaration suivante:

char * SEP = ", ()!?.0123456789";  // l'espace est inclus.

Dessinez le contenu complet du tableau "ligne" (ses 60 emplacements) après la boucle présentée en (A) et indiquez ce qui sera affiché par ce bout de code.

C)

Considérez la déclaration suivante:

char * SEP = ", ()!?.ICSUR";  // l'espace est inclus.

Dessinez le contenu complet du tableau "ligne" (ses 60 emplacements) après la boucle présentée en (A) et indiquez ce qui sera affiché par ce bout de code.

11–11

Un étudiant a écrit le bout de code suivant permettant, selon ses dires, d'initialiser le contenu du tableau T avec 10 mots fournis par l'utilisateur.

#include <stdio.h>
int main(void) {
char mot[50];
char * liste[10];
int i;

for (i = 0; i < 10; i++) // création d'un tableau de 10 chaînes de 50 carac.
liste[i] = (char *) malloc(50 * sizeof(char));

for (i = 0; i < 10; i++) {
printf("Saisissez le mot %i: ", i+1);
gets(mot);
liste[i] = mot;
}

for (i = 0; i < 10; i++)
printf("Le mot %i est : %s\n", i+1, liste[i]);

return 0;
}

Si l'utilisateur saisit les mots suivants dans l'ordre:

CLAVIER, ORDINATEUR, ECRAN, TELEPHONE, IMPRIMANTE, MODEM, DISQUE, DISQUETTE, TELEVISION, SOURIS

qu'est-ce qui sera affiché par son programme? Expliquez et corrigez s'il y a lieu.

11–12

Le bout de code suivant doit lire 10 lignes en interactif et les réafficher en les faisant précéder d'un numéro. Le programme comporte-t-il des problèmes potentiels?

int main(void) {
char * ligne;
int i;
for (i = 0; i < 10; i++) {
gets(ligne);
printf("%2i : %s\n", i+1, ligne);
}
return 0;
}
11–13

Le programme précédent a été réécris en utilisant une fonction permettant de lire une ligne de texte et de la retourner. Le programme comporte-t-il des problèmes potentiels?

char * lireLigne(void);

int main(void) {
char * ligne;
int i;
for (i = 0; i < 10; i++) {
ligne = lireLigne();
printf("%2i : %s\n", i+1, ligne);
}
return 0;
}

char * lireLigne(void){
char enree[80]; gets(entree);

return entree;
}
11–14

Voici un programme devant éliminer d'un texte toute les lignes semblables. Pour effectuer sa tâche, le texte au complet est stocké au fur et à mesure (ligne par ligne) dans un tableau de chaînes de caractères. Chaque ligne est ajoutée au tableau uniquement si elle ne s'y trouve pas déjà. Le programme comporte-t-il des problèmes potentiels? Expliquez et corrigez.

typedef char Chaine[80];

int main(void){
Chaine liste[300];
Chaine lig;
int i;
int dejala;
int N;
N = 0;
while (gets(lig)) {
dejala = 0;
for (i = 0; i < N; i++){
if (liste[i] == lig) {
dejala = 1;
break;
}
}
if (!dejala)
liste[N++] = lig;
}

for (i = 0; i < N; i++)
puts(liste[i]);

return 0;
}
Modifié le: lundi, 16 juin 2014, 15:43