IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Extraire le premier caractere d'une chaine de caractere


Sujet :

C++Builder

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Points : 52
    Points
    52
    Par défaut Extraire le premier caractere d'une chaine de caractere
    Bonjour a tous!!!

    Dans mon programme je lis un tableau exel qui me sert de BDD.
    Si mon programme lis des lettres j'aimerais qu'il m'affiche un message d'erreur.

    J'ai pensé a extraire le premier caractere de la chaine de caractere a chaque fois qu'il lis dans le tableau et a testé si c'est une lettre ou un chiffre si c'est une lettre il l'affiche un message d'erreur.

    comment extraire une partie d'une cahine de caractere??
    comment faire le test "lettre ou chiffre" ??

    Quelqu'un connaitrait-il une meilleur méthode ou bien m'aider a réaliser celle la.

    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    Si la chaîne de caractères est du type char[] ou du type AnsiString le premier caractère est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char cLigne = "Ligne";
    AnsiString asLigne = "Ligne";
    char car1 = cLigne[0];
    char carAs = asLigne[1];
    // pour savoir si c'est un chiffre :
    int rep = isdigit(car1);  // rep est différent de 0 si car1 n'est pas un chiffre

  3. #3
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Pour faire un test d'une chaine, il faut savoir si c'est une AnsiString ou une char.
    Dans les deux cas tu peux avoir accès aux caractères et les tester, mais pas de la même facon en ce qui concerne les conditions aux limites (les extrêmes de ta chaine).

    Voilà un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      char *chaine = "123h86p";
      int i;
      for(i=0;chaine[i] != '\0';i++)
          if(chaine[i] > '9' || chaine[i] < '0')
             ShowMessage("Erreur le caractère "+IntToStr(i+1)+" est un "+chaine[i]);
     
      AnsiString chaine2 = "464g678v32";
      for(i=1;i<chaine2.Length();i++)
          if(chaine2[i] > '9' || chaine2[i] < '0')
             ShowMessage("Erreur le caractère "+IntToStr(i)+" est un "+chaine2[i]);
    Pour le test, tu peux t'inspirer de l'astuce donné pour ne taper que des chiffres ici.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci d'avoir répondu si vite.
    J'ai un probleme quand je compile il m'affiche une erreur:

    Le Projet.exe a provoqué une classe d'exeption.

    Voila le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // extraire le premier caractere
    char car1 = TableauBDD[Index][BDD][1];
     
    // pour savoir si c'est un chiffre :
    int rep= isdigit(car1);  // rep est différent de 0 si car1 n'est pas un chiffre
     
    if (rep == 0)
    ShowMessage(TableauBDD[Index][BDD]);

    Je vois pas le probleme.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Pour faire un test d'une chaine, il faut savoir si c'est une AnsiString ou une char.

    C'est une AnsiString.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    La fonction que je donne plus loin effectue la conversion du contenu d'un AnsiString N vers un double cible (double *F).
    Elle n'est opérationnelle qu'en dehors du scope de BCB car ce dernier intercepte l'exception, si elle a lieu, à son compte.
    On a intérêt à utiliser une conversion vers double puisqu'ici on ne sait pas, à priori, sur quoi la conversion va s'oppérer ("-1", "-10,5" etc...).
    Il est toujours possible de récupérer, au minimum, une valeur int depuis un double :
    double decimal = 10;
    int entier = decimal;

    La fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool IsGoodNumber(AnsiString N, double *F)
    {
    try
        {
        *F = N.ToDouble();
        }
    catch (EConvertError *err)
        {
        return false;
        }
    return true;
    }
    L'usage en est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double result;
    AnsiString MyString; //a toi de passer cet AnsiString comme paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(IsGoodNumber(MyString, &result))
        {
        //result contient la valeur
        }
    else
        {
        //ce qui peut être pénible à la longue :
        ShowMessage("\"" + MyString + "\" ne peut être convertie");
        }
    En espérant que ce soit un bon début de solution...

    A plus !

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci pour ton code henderson.
    Mais c'est beaucoup trop compliqué pour l'application que je veux faire.
    Je veux juste un message d'erreur quand c'est une lettre.
    Bon j'ai cherché et voila se que j'ai trouvé sa marche très bien dans mon programme mais bon il vaut ce qu'il vaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char car1 ;
    AnsiString AnsiCaractere;
    AnsiCaractere = TableauBDD[Index][BDD];
    car1 = (char)AnsiCaractere.c_str()[0];
     
    if(car1<48 || car1>57)
                    ShowMessage("Erreur dans la base, le calcul ne peut etre fait");
    Une question completement hors sujet j'ai ouvert une discussion en avril dernier et j'ai trouvé la solution. Est que je peut encore aller donner la solution et mettre la balise résolu??

    Voila le liens vers la discussion que j'avai ouvert.

    http://www.developpez.net/forums/sho...=cppwebbrowser

    Merci pour vos réponse...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. soustraction de caractere d'une chaine de caracteres
    Par anisj1m dans le forum VBScript
    Réponses: 3
    Dernier message: 13/03/2008, 16h35
  2. Réponses: 2
    Dernier message: 12/03/2008, 13h44
  3. Réponses: 13
    Dernier message: 18/01/2008, 19h53
  4. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  5. Réponses: 2
    Dernier message: 04/11/2005, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo