[Langage C] Vérification chaine de caractére

Fermé
tfmfrench - 18 févr. 2010 à 15:41
 lina - 23 oct. 2011 à 16:14
Bonjour,
Alors voilà j'aimerais savoir s'il existe une fonction en langage C permettant de vérifier si une chaine de caractère et composé uniquement de nombre entier.

Exemple: char Chaine[10]={ 'H', 'e', 'l', 'l', 'o', '\0' }; ok
char Chaine[10]={ 'H', 'e', 'l', 'l', '0', '\0' }; pas ok

merci d'avance
A voir également:

16 réponses

Utilisateur anonyme
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 !
1
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:33
Salut,

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,
0
isdigit();
dans ctype.h
0
Bonjour, j'arrive pas à faire des programmes concernant les fonctions isdigit et isxdigit de la bibliothèque CTYPE. merci d'avance :)
0
Voilà ma fonction de comparaison caractère par caractère:

#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;
} 
1
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
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,
0
Merci à tous pour vos réponses, je fait mon programme et je le poste dans la soirée.
0

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 ===|
0
Petit up :)
0
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
Salut,

Il faudrait que tu nous donnes les typedef car on ne connait pas pel, el, etc.

Cdlt,
0
Oups, désoler.

Voilà les typedef:

typedef struct el*pel;

typedef struct el{
    int identifiant;
    char message[100];
    int parametre[4];
    pel suivant;
}tel; 
0
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
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 ?
0
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:

#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;
}
0
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
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.
0
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:

L'identifiant <&#9792;> n'est pas un entier
0
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
As-tu corrigé le problème signalé plus haut avec : char d; int test=isdigit(d) ?
0
Je ne suis pas vraiment certain de la manière pour initialisé "d".
j'ai mis:

char d=0;
int test = isdigit (d); 
0
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
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;
0
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
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)
#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/
0