A voir également:
- [Langage C] Vérification chaine de caractére
- Caractère ascii - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Caractère spéciaux mac clavier - Guide
- Vérification lien - Guide
16 réponses
Utilisateur anonyme
18 févr. 2010 à 18:02
18 févr. 2010 à 18:02
Bonjour.
Pour apprendre le C, je te conseille le tutoriel proposé sur le site du zéro (plus complet).
Pour déclarer ta chaine, tu peux faire char Chaine[]="Hello";
Pour tester une chaîne, tu as 2 solutions :
La plus simple : inclure la bibliothèque "string.h" et utiliser la fonction strcmp.
Créer ta propre fonction testant les caractères 1 par 1.
Si tu as besoin d'aide, n'hésite pas !
Pour apprendre le C, je te conseille le tutoriel proposé sur le site du zéro (plus complet).
Pour déclarer ta chaine, tu peux faire char Chaine[]="Hello";
Pour tester une chaîne, tu as 2 solutions :
La plus simple : inclure la bibliothèque "string.h" et utiliser la fonction strcmp.
Créer ta propre fonction testant les caractères 1 par 1.
Si tu as besoin d'aide, n'hésite pas !
Voilà ma fonction de comparaison caractère par caractère:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
Par contre je ne voit pas comment l'utilisé pour tout une chaine de caractère, sachant que la chaine fait partie de la fonction suivante :
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
main (){ int d = 'h'; int test = isdigit (d); if (test != 0){ printf ("Le caractere (%c) est un entier",d); } else{ printf ("Le caractere (%c) n'est pas un entier",d ); } return 0; }
Par contre je ne voit pas comment l'utilisé pour tout une chaine de caractère, sachant que la chaine fait partie de la fonction suivante :
pel creelem(){ int i; pel tache=(pel)malloc(sizeof(tel)); printf("Veuillez entrez un identifiant:"); scanf("%s", &tache->identifiant); printf("\n"); printf("Veuillez entrez un message:"); scanf("%s",tache->message); printf("\n"); for (i=0; i<4; i++){ printf("Entrez le paramétre entier n°%i:", i+1); scanf("%i",&tache->parametre[i]); printf("\n"); } tache->suivant=NULL; return tache; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
18 févr. 2010 à 19:38
18 févr. 2010 à 19:38
Bonsoir,
Il n'existe pas de fonctions standards prêtes à l'emploi pour résoudre ton problème.
Par contre, faire la fonction soi-même n'est pas difficile.
Tu parcours caractère par caractère la chaîne et tu testes si c'est un chiffre (Tu peux utiliser la fonction isdigit dont le prototype est défini dans ctype.h qui te permettra de savoir si le caractère est un chiffre).
Si c'est un chiffre tu retournes une valeur 1 (par exemple).
A la fin de la boucle tu retournes une valeur 0 (par exemple).
Si tu as un doute sur le codage de l'algorithme ci-dessus, n'hésite pas à poster son implémentation. On t'aidera à le corriger.
Cdlt,
Il n'existe pas de fonctions standards prêtes à l'emploi pour résoudre ton problème.
Par contre, faire la fonction soi-même n'est pas difficile.
Tu parcours caractère par caractère la chaîne et tu testes si c'est un chiffre (Tu peux utiliser la fonction isdigit dont le prototype est défini dans ctype.h qui te permettra de savoir si le caractère est un chiffre).
Si c'est un chiffre tu retournes une valeur 1 (par exemple).
A la fin de la boucle tu retournes une valeur 0 (par exemple).
Si tu as un doute sur le codage de l'algorithme ci-dessus, n'hésite pas à poster son implémentation. On t'aidera à le corriger.
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Voilà un début de piste mais j'ai une erreur de compilation :
pel creelem(){ int i; char d; int test = isdigit (d); pel tache=(pel)malloc(sizeof(tel)); do { printf("Veuillez entrez un identifiant:"); scanf("%i", &tache->identifiant); d=&tache->identifiant; if (test != 0){ printf ("L'identifiant(%c) est un entier",d); } else{ printf ("L'identifiant(%c) n'est pas un entier",d ); } return 0; } while ( isdigit (d)!=0); printf("\n"); printf("Veuillez entrez un message:"); scanf("%s",tache->message); printf("\n"); for (i=0; i<4; i++){ printf("Entrez le paramétre entier n°%i:", i+1); scanf("%i",&tache->parametre[i]); printf("\n"); } tache->suivant=NULL; return tache; }
C:\Users\Fab\Documents\test.c||In function `el* creelem()':| C:\Users\Fab\Documents\test.c|25|error: invalid conversion from `int*' to `char'| ||=== Build finished: 1 errors, 0 warnings ===|
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
21 févr. 2010 à 14:19
21 févr. 2010 à 14:19
Salut,
Il faudrait que tu nous donnes les typedef car on ne connait pas pel, el, etc.
Cdlt,
Il faudrait que tu nous donnes les typedef car on ne connait pas pel, el, etc.
Cdlt,
Oups, désoler.
Voilà les typedef:
typedef struct el*pel;
Voilà les typedef:
typedef struct el*pel;
typedef struct el{ int identifiant; char message[100]; int parametre[4]; pel suivant; }tel;
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
21 févr. 2010 à 15:18
21 févr. 2010 à 15:18
char d;
int test = isdigit (d);
Que vaut le char d ? Rien, c'est une valeur non fixée. Donc la variable test contiendra une valeur bidon également.
Par ailleurs, je ne vois pas l'intérêt de faire ton malloc ? Pourquoi vouloir utiliser un pointeur ?
Et enfin, cela nous aiderait beaucoup si tu précisais quelle ligne est la numéro 25 ?
int test = isdigit (d);
Que vaut le char d ? Rien, c'est une valeur non fixée. Donc la variable test contiendra une valeur bidon également.
Par ailleurs, je ne vois pas l'intérêt de faire ton malloc ? Pourquoi vouloir utiliser un pointeur ?
Et enfin, cela nous aiderait beaucoup si tu précisais quelle ligne est la numéro 25 ?
Alors voilà:
-Le malloc c'est parce-que je ne sait pas combien j'ai de tache et parce-que je veux pouvoir en ajouter et en supprimer autant que je veux.
- Le "d" viens de là: L'utilisateur doit entrer un identifiant sous forme d'entier. J'ai donc créé un programme tout simple qui vérifie si un caractère et bien un entier:
que j'ai voulu implémenter dans mon programme suivant
Se qui donne:
-Le malloc c'est parce-que je ne sait pas combien j'ai de tache et parce-que je veux pouvoir en ajouter et en supprimer autant que je veux.
- Le "d" viens de là: L'utilisateur doit entrer un identifiant sous forme d'entier. J'ai donc créé un programme tout simple qui vérifie si un caractère et bien un entier:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> main (){ int d = 'h'; int test = isdigit (d); if (test != 0){ printf ("Le caractere (%c) est un entier",d); } else{ printf ("L'identifiant(%c) n'est pas un entier",d ); } return 0; }
que j'ai voulu implémenter dans mon programme suivant
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct el*pel; typedef struct el{ int identifiant; char message[100]; int parametre[4]; pel suivant; }tel; pel creelem(){ int i; pel tache=(pel)malloc(sizeof(tel)); printf("Veuillez entrez un identifiant:"); scanf("%i", &tache->identifiant); printf("\n"); printf("Veuillez entrez un message:"); scanf("%s",tache->message); printf("\n"); for (i=0; i<4; i++){ printf("Entrez le paramétre entier n°%i:", i+1); scanf("%i",&tache->parametre[i]); printf("\n"); } tache->suivant=NULL; return tache; }
Se qui donne:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct el*pel; typedef struct el{ int identifiant; char message[100]; int parametre[4]; pel suivant; }tel; pel creelem(){ int i; char d; int test = isdigit (d); pel tache=(pel)malloc(sizeof(tel)); do { printf("Veuillez entrez un identifiant:"); scanf("%i", &tache->identifiant); d=&tache->identifiant; if (test != 0){ // LIGNE 25 printf ("L'identifiant(%c) est un entier",d); } else{ printf ("L'identifiant(%c) n'est pas un entier",d ); } return 0; } while ( isdigit (d)!=0); printf("\n"); printf("Veuillez entrez un message:"); scanf("%s",tache->message); printf("\n"); for (i=0; i<4; i++){ printf("Entrez le paramétre entier n°%i:", i+1); scanf("%i",&tache->parametre[i]); printf("\n"); } tache->suivant=NULL; return tache; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
21 févr. 2010 à 15:51
21 févr. 2010 à 15:51
J'avais compris l'utilité du char d.
Quand je te faisais cette remarque, c'était pour te souffler le fait qu'il y avait une erreur.
Dans ton programme, tu fais ça :
char d;
int test = isdigit (d);
Le problème c'est que le compilateur lorsqu'il va voir : char d; il va te créer une place d'un byte dans pile. Et comme tu l'initialises pas, "d" aura une valeur bidon.
Et ensuite tu fais isdigit(d) qui te retournera également une valeur bidon.
Il faut donc corriger l'algorithme pour ne plus faire apparaître ce désagrément.
Dans ton programme test, tu n'avais pas ce problème puisque tu faisais char d='t' (tu initialisais bel et bien la variable).
d=&tache->identifiant;
d est un char. Pourquoi lui affecter l'adresse de tache->identifiant ? Il faut enlever l'esperluette devant (&).
C'est ce qui fait crier ton compilateur.
Quand je te faisais cette remarque, c'était pour te souffler le fait qu'il y avait une erreur.
Dans ton programme, tu fais ça :
char d;
int test = isdigit (d);
Le problème c'est que le compilateur lorsqu'il va voir : char d; il va te créer une place d'un byte dans pile. Et comme tu l'initialises pas, "d" aura une valeur bidon.
Et ensuite tu fais isdigit(d) qui te retournera également une valeur bidon.
Il faut donc corriger l'algorithme pour ne plus faire apparaître ce désagrément.
Dans ton programme test, tu n'avais pas ce problème puisque tu faisais char d='t' (tu initialisais bel et bien la variable).
d=&tache->identifiant;
d est un char. Pourquoi lui affecter l'adresse de tache->identifiant ? Il faut enlever l'esperluette devant (&).
C'est ce qui fait crier ton compilateur.
C'est exacte, je n'avait pas fait attention à l'opérateur d'adresse "&".
Je n'est plus de problème de compilation mais je viens d'avoir une "chose" bizarre lors de la simulation.
J'ai mis 12 comme identifiant et j'ai le message suivant:
Je n'est plus de problème de compilation mais je viens d'avoir une "chose" bizarre lors de la simulation.
J'ai mis 12 comme identifiant et j'ai le message suivant:
L'identifiant <♀> n'est pas un entier
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
21 févr. 2010 à 16:08
21 févr. 2010 à 16:08
As-tu corrigé le problème signalé plus haut avec : char d; int test=isdigit(d) ?
Je ne suis pas vraiment certain de la manière pour initialisé "d".
j'ai mis:
j'ai mis:
char d=0; int test = isdigit (d);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 835
21 févr. 2010 à 17:55
21 févr. 2010 à 17:55
C'est surtout une erreur d'algorithme.
J'ai pas bien compris ce que tu souhaites faire, mais a priori, j'enlèverais isdigit pour ne laisser que les déclarations de variable.
Et à la place je mettrais : test=isdigit(d); juste après : d=tache->identifiant;
J'ai pas bien compris ce que tu souhaites faire, mais a priori, j'enlèverais isdigit pour ne laisser que les déclarations de variable.
Et à la place je mettrais : test=isdigit(d); juste après : d=tache->identifiant;
Emmanuel Delahaye
Messages postés
106
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7
26 févr. 2010 à 23:27
26 févr. 2010 à 23:27
Tu peux convertir la chaine avec sscanf() et "%d" (<stdio.h>) et tester le code retour. Si il vaut 1, c'est que la conversion a réussi (tous les caractères sont valides), sinon, c'est que résultat de la conversion a échoué (caractères erronées)
Mais si la chaine commence par des caractères valides, la conversion aura quand même lieu.
Il faut donc un mécanisme plus puissant comme strtol() et son 2 ème paramètre. O passe l'adresse d'un pointeur sur chaine et celui-ci est mis a jour de façon à pointer sur le dernier caractère non traduit. Si c'est 0, c'est qu'on a pu traduire toute la chaine. Si c'est autre chose, c'est qu'il y a au moins un caractère hors champs.
Qui donne :
Évidemment, pour comprendre ce code, il faut lire la doc de strtol()...
http://www.cplusplus.com/reference/cstdlib/strtol/
#include <stdio.h> int main (void) { { char s[] = "1234"; int n; int ret = sscanf (s, "%d", &n); if (ret == 1) { puts ("OK"); } else { puts ("KO"); } } { char s[] = "az12"; int n; int ret = sscanf (s, "%d", &n); if (ret == 1) { puts ("OK"); } else { puts ("KO"); } } return 0; }
Mais si la chaine commence par des caractères valides, la conversion aura quand même lieu.
{ char s[] = "12az"; int n; int ret = sscanf (s, "%d", &n); if (ret == 1) { puts ("OK"); } else { puts ("KO"); } }
Il faut donc un mécanisme plus puissant comme strtol() et son 2 ème paramètre. O passe l'adresse d'un pointeur sur chaine et celui-ci est mis a jour de façon à pointer sur le dernier caractère non traduit. Si c'est 0, c'est qu'on a pu traduire toute la chaine. Si c'est autre chose, c'est qu'il y a au moins un caractère hors champs.
#include <stdio.h> #include <stdlib.h> int main (void) { { char s[] = "1234"; char *p; long n = strtol (s, &p, 10); if (*p == 0) { printf ("OK (n=%ld)\n", n); } else { puts ("KO"); } } { char s[] = "az12"; char *p; long n = strtol (s, &p, 10); if (*p == 0) { printf ("OK (n=%ld)\n", n); } else { puts ("KO"); } } { char s[] = "12az"; char *p; long n = strtol (s, &p, 10); if (*p == 0) { printf ("OK (n=%ld)\n", n); } else { puts ("KO"); } } return 0; }
Qui donne :
OK (n=1234) KO KO Process returned 0 (0x0) execution time : 0.021 s Press any key to continue.
Évidemment, pour comprendre ce code, il faut lire la doc de strtol()...
http://www.cplusplus.com/reference/cstdlib/strtol/
18 févr. 2010 à 19:33
string.h n'est pas une bibliothèque.
De plus, strcmp ne va pas permettre de résoudre ce problème puisque strcmp c'est pour comparer des chaînes de caractères.
Cdlt,
11 mars 2011 à 00:41
dans ctype.h
23 oct. 2011 à 16:14