Chaînes de caractères en C - Applications résolues
1) Realiser un programme pour montrer la difference entre 'A' et "A".
#include<stdio.h> #include<conio.h> void main() { char a1='A'; char a2[]="A"; printf("%c %c %s",a1,a2[0],a2); //afficher le contenu de deux variables printf("\n%d %d",sizeof(a1),sizeof(a2)); //on verifie la memoire occupee par les deux variables printf("\n%s c'est a dire %d",a2[1],a2[1]); //on voit le deuxiem element getch(); }
2) D'élaborer un programme qui affiche dans une chaîne de caractères les majuscules de l'alphabet et traite sur lui.
#include<stdio.h> #include<string.h> #include<conio.h> void main() { char a[256]; for(int i=0;i<26;i++) a[i]='A'+i; puts("La chaine contient:"); printf("\"%s\"",a); //on veut ajouter a la fin le caractere '1' et afficher de nouveau la chaine a[26]='1'; a[27]='2'; a[28]=0; printf("\n\"%s\"",a); //afficher le nombre des caracteres de la chaine printf("\nLe nombre de caracteres est %d",strlen(a)); //afficher la chaine en commencant avec le deuxieme element jusqu’au dixieme a[10]=0; //sau NULL printf("\n\"%s\"",a+1); // !!! ne mettez pas a++ printf("\n\"%s\"",a+6); //afficher de nouveau le nombre de de caracteres de la chaine printf("\nNombre de caracteres est%d",strlen(a)); /*introduire une nouvelle variable p qui va retenir l’adresse du vecteur de caracteres a le nom du vecteur (a) c’est l’adresse et c’est la meme adresse du premier element a[0]*/ char *p; p=a; /*cette attribution est correcte, la variable p retient l’adresse du vecteur de caracteres a, c’est a dire l’adresse du premier octet. En place, l’attribution a=p n’est pas correcte cat a est une constante */ //apres l’attribution on peut utiliser p dans les memes conditions que a printf("\n%s",p); // quatre relations de trouver adresse de vecteur équivalents printf("\n%p",p); printf("\n%p",a); printf("\n%p",&p[0]); printf("\n%p",&a[0]); /* si au contenu de la variable p on ajoute 1, elle va retenir l’adresse du vecteur dont le premier element c’est comme le deuxiem octet (element) du vecteur */ printf("\n%s",++p); //p++; printf("\n%s",p); printf("\n%s",p++); //deux adresses equivalentes printf("\n%p",p); printf("\n%p",&a[2]); //le nouveau vecteur peut s’adresser sur les octets printf("\n%c",p[0]); //va afficher l’element'C' printf("\n%c",p[-2]); //va afficher l’element'A' /* on peut faire des dim inutions entre les adresses. Dans ce cas, le resultat est un antier et par p-a on obtient indice en a du premier octet retenu en p */ printf("\n%d",p-a); getch(); }
3) Difference entre le type chaine qui represente des caracteres et le type adresse pour memorisation d’une chaine de caracteres.
#include<stdio.h> #include<string.h> #include<conio.h> void main() { char a[]="Salut C!"; // chaine des elements qui representent caracteres char* b="Salut C!"; // type adresse pour memorises une chaine de caracteres puts(a); puts(b); printf("%d",sizeof(a)); printf("\n%d",sizeof(b)); getch(); }
4) En lecturant une chaine du clavier, afficher par chaque caractere et determiner le nombre de caracteres et en prenant une autre chaine, l’ajouter ou copier dans la premiere chaine.
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> void main() { char* a; //chaine introduite par l’utilisateur int i; //indexe de la chaine a=(char*)malloc(sizeof(char)*255) ; printf("Entrez une chaine et appuyez sur Entree \n"); gets(a); //scanf("%s",&a); //Aficher chaque caractere jusqu’a trouver NULL for(i=0;a[i]!=NULL;i++) putchar(a[i]); //sau printf("%c",a[i]); printf("\nNombre de caracteres est %d c’est a dire %d",i,strlen(a)); //on ne compte pas le caractere NULL //je veux introduire une nouvelle chaine de caracteres char b[]=" autre chaine"; strcat(a,b); //j’ajoute la chaine d’adresse b a la chaine a (realizer leur concatenation) printf("\nnouveau chaine a est \"%s\"",a); // or puts("La nouvelle chaine est"); puts(a); strcpy(b,a); //copier la chaine a dans b puts("\nLa nouvelle chaine b est:"); puts(b); //comparer de deux chaines printf("%d",strcmp(a,b)); getch(); }
5) Determiner le nombre des mots d’un texte.
#include<stdio.h> #include<string.h> #include<conio.h> void main() { int k=0; char txt[1024]; //Chaine intyroduite par l’utilisateur char* p; printf("Introduire une chaine de caracteres et appuyer Entree\n"); gets(txt); //scanf("%s",&txt); p=strtok(txt," "); while (p!=NULL) { p=strtok(NULL, " "); k++; } printf("\nLe nombre des mots est: %d",k); //on ne compte pas le c aractere NULL getch(); }
6) Determiner le nombre de mots d’un texte, avec une fonction propre.
#include<stdio.h> #include<string.h> #include<conio.h> int separare(char* txt, char* p) { int k=0; p=strtok(txt," "); while (p!=NULL) { p=strtok(NULL, " "); k++; } return k; } void main() { int k; char txt[1024]; //chain introduite par l’utilisateur char p; printf("Introduire une chaine de caracteres et appuyez Entree\n"); gets(txt); //scanf("%s",&txt); printf("\nLe nombre de mots est: %d",separare(txt,&p)); //on ne compte pas le caractere NULL getch(); }
7) Realiser un programme qui lit dans une chaine n mots. Elles seront triees alfabetique.
#include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> /* Il y a des applications quand il doit travailler avec n mots – en comprenant par le caractere une succession de caracteres qui ne sont pa sblanches. Danc ce cas on a la possibilite de declarer les vecteurs de mots. Ce sont en fait des matrices avec des elements de base de type char. */ void main() { char mots[10][25]; /* chaque ligne de 10 de cette matrice peut retenir une chaine de type char*. Elle peut avoir le plus 25 de caracteres (avec le nul). On peut adreser les mots par a[0] (le premier mot), a[1] (le deuxiem mot) etc*/ char *aux; int i,n,trouve; printf("Donnez le nombre des mots: "); scanf("%d",&n); for(i=0;i<n;i++) { printf("mot: "); scanf("%s",&mots[i]); } do { trouve=0; for(i=0;i<n-1;i++) if ( strcmp(mots[i],mots[i+1]) > 0 ) { strcpy(aux,mots[i]); strcpy(mots[i],mots[i+1]); strcpy(mots[i+1],aux); trouve=1; } } while (trouve); for(i=0;i<n;i++) printf("\n%s",mots[i]); getch(); }