salut,
comment vérifier est ce que une chaîne contient des chiffres ou des espace?
salut,
comment vérifier est ce que une chaîne contient des chiffres ou des espace?
tu peux créer une fonction qui fait cela ,
essaye et demande de l'aide avec un code source si tu n'y arrives pas
Salut,
Regardes comment est construite la table ASCII(128 caractères) et ASCIIE ( ASCII Etendue de 256 caractères )
ASCII
ASCIIE
Pour obtenir le code décimal d'un caractère, il suffit de le convertir en entier.
Le résultat sera
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char c = 'a'; printf("c vaut %d en base 10", c\n);
Notamment les caractères a à z et A à Z sont "contiguës". Si tu connais la valeur de a ou de A en décimal, tu peux aisément trouver la valeur des autres caractères en incrémentant la valeur de 'a', du nombre qui le sépare de celui que tu souhaites trouver.
Code : Sélectionner tout - Visualiser dans une fenêtre à part c vaut 65 en base 10
Par exemple c : a,b,c = a+2 = 67.
Tu peux également faire des comparaisons.
Par exemples, si tu veux savoir si un caractère appartient à l’alphabet (minuscule), tu peux faire.
Cela est valable, car comme je le disais, ces valeurs sont contiguës.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( 'a' <= c && c <= 'z' )
Par exemple, si tu veux savoir si un caractère est contenu dans l'alphabet minuscule ou majuscule :
... est incorrect car de a à z c'est contiguë, de A à Z aussi mais pas de z à A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( 'a' <= c && c <= 'Z' )
Il faut écrire :
.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' )
Remarque, le décalage entre les lettres minuscules et majuscules est :
... car autre remarque, les lettres majuscules sont placées avant les lettres minuscules. Si tu ne t'en souviens plus, tu peux utiliser une valeur absolue ou tester le signe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int decalage = 'a' - 'A';
Aussi pour passer d'une minuscule à une majuscule :
Ce qui vaut bien 'A'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char a_majuscule = 'a'-('a'-'A')
... et ainsi de suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char b_majuscule = 'b'-('a'-'A')
Pour les chiffres, c'est pareil :
Pour faire ce que tu veux donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( '0' <= c && c <= '9' )
Cette fonction s'arrête dès qu'un des caractères 0..9 ou espace est rencontré. Si tu souhaites connaître la quantité de chacun, tu peux faire comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 unsigned int check_str( char *c ) { if (c) { while ( *c != '\0' ) // On suppose que ta chaîne contient bien le caractère de fin de contrôle '\0' sinon, cela ne va pas marcher. { if ( '0' <= *c && *c <= '9' || *c == ' ') return 1; c++; } } else printf("\n check_str :: c = NULL"); return 0; }
Ce qui donne le résultat attendu, à savoir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 #include <stdio.h> #include <stdlib.h> int check_str(char *c, int *numeric, int *space) { *numeric = 0; *space = 0; if ( (c && numeric && space) ) { while ( *c != '\0') { if ( '0' <= *c && *c <= '9' ) (*numeric)++; if ( *c == ' ' ) (*space)++; c++; } } else printf("\n check_str :: Au moins un des pointeurs passés en paramètre est NULL"); if ( *space != 0 || *numeric != 0 ) //Un de ces caractères a été trouvé au moins une fois donc résultat positif return 1; // Sinon negatif, on retourne 0 return 0; } int main() { char *str1 = "chaine numero 1"; char *str2 = "bonjour"; int a,b,resultat; resultat = check_str(str1, &a, &b); printf("\n resultat pour str1 : %d\n\t Nombre de caracteres numeriques : %d\n\t Nombre d'espace : %d\n\n", resultat, a, b); resultat = check_str(str2, &a, &b); printf("\n resultat pour str1 : %d\n\t Nombre de caracteres numeriques : %d\n\t Nombre d'espace : %d\n\n", resultat, a, b); return 0; }
Voici quelques fonctions qui illustrent des opérations de ce genre. A toi d'y jeter un oeil.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 resultat pour str1 : 1 Nombre de caracteres numeriques : 1 Nombre d'espace : 2 resultat pour str1 : 0 Nombre de caracteres numeriques : 0 Nombre d'espace : 0
Cordialement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 unsigned long long int str_length(const char *S) { unsigned long long int c = 0; while( *S != '\0') c++, S++; return c; } unsigned long long int str_count_occurrence(char *s, char c) { unsigned long long int o = 0; while( *s != '\0') { if ( *s == c ) o++; s++; } return o; } unsigned long long int is_in_list(char c, char *c_list) { unsigned int i; for (i=0 ; i<str_length(c_list) ; i++ ) if ( c == c_list[i] ) return TRUE; return FALSE; } unsigned long long int is_alpha( char c ) { if ( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) return TRUE; else return FALSE; } unsigned long long int is_numeric( char c ) { if ( '0' <= c && c <= '9') return TRUE; else return FALSE; } unsigned long long int str_count_alpha( char *s ) { unsigned long long int counter=0; while ( *s != '\0' ) { if ( is_alpha(*s) == TRUE ) counter++; s++; } return counter; } unsigned long long int str_count_numeric( char *s ) { unsigned long long int counter=0; while ( *s != '\0' ) { if ( is_numeric(*s) ) counter++; s++; } return counter; } unsigned long long int str_is_alpha(char *s) { while (*s != '\0') { if ( is_alpha(*s) == FALSE ) return FALSE; s++; } return TRUE; } unsigned long long int str_is_numeric(char *s) { while (*s != '\0') { if ( is_numeric(*s) == FALSE ) return FALSE; s++; } return TRUE; }
Si tu veux seulement savoir si ta chaîne contient des espaces ou des chiffres, tu peux utiliser strpbrk(). Man strpbrk()
Si la valeur de retour est NULL ça veut dire qu'il n'y'a pas de chiffre ou d'espace.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *p = strpbrk(taChaine, "0123456789 ");
strchr() peut aussi être utile. Enfin ça dépend un peu de ce que ça te prend vraiment.
EDIT: Dans mon exemple si y'a un chiffre avant un espace dans ta chaîne, tu ne sauras pas si il y'a un espace. Et inversement si il y'a un espace avant un chiffre. Juste à faire 2 tests au pire.
Tu as aussi des fonctions utiles déclarées dans <ctype.h> pour vérifier le type de différent caractères.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager