bonjour,
j'aimerais savoir si il est possible de tester un pointeur dans une condition du style
Code:
1
2
3
4
5 If (*pointeur == "ok" ) { } else { }
Version imprimable
bonjour,
j'aimerais savoir si il est possible de tester un pointeur dans une condition du style
Code:
1
2
3
4
5 If (*pointeur == "ok" ) { } else { }
Tu veux bien tester que la variable pointée par ton pointeur est la chaîne de caractères "ok" ? Si c'est ça, tu ne peux pas. En effet, *pointeur est un char (si pointeur est de type pointeur sur char) et non une chaîne de caractère.
Si en revanche tu cherches à faire if (pointeur == "ok" ), le comportement est indéterminé d'après gcc. C'est sûrement parce l'adresse à laquelle est stockée la chaîne constante "ok" du test est indéterminée, et qu'il n'y a aucune raison que toutes les chaînes contenant "ok" soient stockées au même endroit.
Dans le cas 1, il te faut utiliser une fonction de comparaison de chaînes de caractères, comme strcmp dont le prototype est fourni par string.h:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <stdio.h> #include <string.h> int main (void) { char *pointeur="ok"; if ( strcmp(pointeur, "ok")==0 ) printf("OK\n"); else printf("NOK\n"); return 0; }
merci ceci à résolu mon problème
je suis idiot, j'ai oublié que c'était une chaine de caractère :aie:
J'ai une seconde question ;)
comment fait-on la même chose avec un switch ?
"La même chose" avec un switch ?
Impossible.
Un switch/case ne peut vérifier que des valeurs entières (int, char, ... (unsigned? j'avais lu qu'un switch était limité à 0-255 en case, est-ce toujours vrai ? obsolète ? toujours été faux ?)).
J'avais aussi un souvenir de 255 valeurs possibles. J'ai remarqué la norme C99 (edit : grillé par diogene) et comme en C11, le compilateur est censé supporte 1023 labels. On doit avoir des souvenirs faux ou alors du C89 :aie:
Il faut voir le switch comme (presque) une batterie de if où tu compares une valeur à une autre. Tu ne peux pas comparer directement deux tableaux, donc tu peux pas faire un switch avec une chaine de caractères.Citation:
comment fait-on la même chose avec un switch ?
@Bousk : Merci pour l'information, je ne savais pas que ça devait être un entier !
D'ailleurs, en testant, je me suis aperçu que ce doit être une constante entière, sinon erreur : l'étiquette du « case » ne se réduit pas en une constante entière.
ça dépend de ce que tu entends par "la même chose".
Utiliser des chaînes, tu peux en les comparant caractère par caractère :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 switch ( *p ) { case 'd' : if ( *(p+1) == 'e' ) fprintf ( stderr, "DEBUT"); else fprintf ( stderr, "%s", p); break ; case 'f' : if ( *(p+1) == 'i' ) fprintf (stderr, "FIN"); else fprintf ( stderr, " %s", p); break ; }
On pourrait le faire directement avec les caractères :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 switch ( Ligne[0] ) { case 'd' : if ( Ligne[1] == 'e' ) fprintf ( stderr, "DEBUT"); else fprintf ( stderr, "%s", Ligne); break ; case 'f' : if ( Ligne[1] == 'i' ) fprintf (stderr, "FIN"); else fprintf ( stderr, " %s", Ligne); break ; }
Faire un switch directement sur une valeur de pointeur est, comme indiqué ci-dessus, normalement impossible..
Bonsoir,
Une autre approche mettant en oeuvre un switch/case pour tester des chaînes de caractères.
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 #include <stdio.h> enum { R_OK = 0, R_PAS_OK, R_JE_SAIS_PAS, R_COUT} ; char * mesReponses[R_COUT] = {"OK","PAS OK", "JE SAIS PAS"}; int main(int argc, char* argv[]) { char * p2Test = "JE SAIS PAS"; switch(GetStrIndex(p2Test)) { case R_OK: printf("OK trouve"); break; case R_PAS_OK: printf("PAS OK trouve"); break; case R_JE_SAIS_PAS: printf("JE SAIS PAS trouve"); break; default: printf("ERREUR : inconnu <%s>", p2Test); break; } getch(); return 0; } int GetStrIndex(char * pStr) { int i; for (i=0 ; i<R_COUT ; i++) { if(strcmp(mesReponses[i], pStr) == 0) break; } return i < R_COUT ? i : -1; }
Encore une autre approche si tu as peu de chaînes est d'utiliser une fonction de hachage et de faire un switch sur la valeur obtenue:lol:. Plus sérieusement, j'ai lu quelque part (sans doute dans les commentaires de cette même page) qu'il existait des algorithmes permettant de déterminer une fonction de hachage qui ne cause pas de collisions sur un ensemble restreint.
(voir les liens externes dans le dernier lien posté)