salut,
comment vérifier est ce que une chaîne contient des chiffres ou des espace?
Version imprimable
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 seraCode:
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: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: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:if ( 'a' <= c && c <= 'Z' )
Il faut écrire :
.Code: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:int decalage = 'a' - 'A';
Aussi pour passer d'une minuscule à une majuscule :
Ce qui vaut bien 'A'.Code:char a_majuscule = 'a'-('a'-'A')
... et ainsi de suite.Code:char b_majuscule = 'b'-('a'-'A')
Pour les chiffres, c'est pareil :
Pour faire ce que tu veux donc :Code: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:
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:
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:
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:
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:
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.