Accueil > Forum > > > > Extraire entier d'une chaine
Extraire entier d'une chaine
mardi 10 novembre 2009 à 18:00:14 |
Extraire entier d'une chaine

Vylco
|
Bonjour, voila j'ai un exo a faire en algo mais je vois pas comment le faire.
la consigne: soit une chaine de caractère. Ecrivez une fonction qui recoit cette chaine et qui extrait toutes les valeures numeriques comprises entre 10 et 30 pour les mettre dans un tableau.
exemple: Ch=<<fsdfs18seryrtr21htrr13rgerger1225rte17htyyt29jy>>
le tableau contiendra : 18,21,13,29
j'ai commencé le début mais je vois pas quelle fonction utilisé et comment savoir une valeure de la chaine des numériques ou non, bref chui perdu  , quelqu'un a une idée ? thank you bien d'avance.
Code C/C++ : #include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
void main()
{
char ch[200];
printf("saisir une chaine alphanumerique\n");
scanf("%s",&ch);
}
char Extraire_Num(char une_chaine)
{
int i;
int tab[];
for(i=0;i<strlen(une_chaine);i++)
{
|
|
mardi 10 novembre 2009 à 20:51:28 |
Re : Extraire entier d'une chaine

CptPingu
|
Je vais te donner tout ce qu'il faut pour résoudre cet exercice:
Tout d'abord la méthode:
- Tu parcours ta chaînes jusqu'à trouver un chiffre.
- Quand tu en trouves un, tu poses un marqueur (c'est à dire tu retiens la position du caractère dans la chaîne).
- Tu continues de parcourir la chaîne, jusqu'à tomber sur un caractère qui n'est pas un chiffre ou la fin de la chaîne. Tu retiens cette position.
- Tu recopie la chaîne de la première position, à la deuxième (du 1er marqueur jusqu'au deuxième).
- Tu convertis la chaîne obtenu en chiffre.
- Si le chiffre est compris entre 10 et 30, tu l'ajoutes au tableau, sinon tu ne fais rien.
- Tu effaces les marqueurs (en leur donnant une position de -1 par exemple).
- Tu repars de la ou tu étais, et tu recommence jusqu'à tomber sur la fin de la chaîne.
- Au sortir de la boucle, tu auras le tableau désiré.
Ensuite, quelques outils:
- Accéder à un élément du tableau: tab[0] => 1er élément, tab[1] => 2ème élément.
- Convertir une chaîne en entier: atoi
- Recopier une chaîne: strcpy, strncpy
- Pour ton tableau, donne lui simplement une grande taille. (Sauf si tu as déjà vu en cours les réallocations mémoires, auquel cas il te faut realloc)
Tu as maintenant tout ce qu'il faut pour résoudre cet exercice.
|
|
mardi 10 novembre 2009 à 21:26:11 |
Re : Extraire entier d'une chaine

Vylco
|
ok merci pour toute les explications jvai tester tous sa demain 
|
|
mercredi 11 novembre 2009 à 16:28:46 |
Re : Extraire entier d'une chaine

Vylco
|
Lut Captain, tu pourrais jeter un oeil à ce que j'ai fais parce que j'ai des erreurs et j'ai des questions aussi
Est ce que sa à l'air correct déja ?
Ensuite chui un peu perdu avec les pointeurs et du coup sa me donne quelque erreur genre
error C2296: '*' : non conforme, l'opérande gauche est du type 'int (__cdecl *)(int)'
error C2296: '*' : non conforme, l'opérande gauche est du type 'size_t (__cdecl *)(const char *)'
error C2297: '*' : non conforme, l'opérande droit est du type 'char *'
Merci d'avance pour les eclaircissements
Code C/C++ : void Extraire_Num(char *une_chaine)
{
int i,mdeb,mfin,j;
int tab[100];
char chtemp;
j=0;
//parcours de la chaine de caractère
for(i=0;i<strlen(une_chaine);i++)
{
//si on tombe sur un chiffre
if (isdigit*(une_chaine[i]))
{
//on affecte le marqueur de début par l'indice
mdeb=i;
//tant qu'on est pas à la fin de la chaine ou que l'on ne rencontre pas de caractère
while(mdeb<strlen*(une_chaine) && !isdigit*(une_chaine[j]))
{
//le marqueur de fin prend l'indice
mfin=j;
}
//on parcours alors la chaine entre nos 2 marqueurs
for(mdeb<mfin)
{
strcat(chtemp,*une_chaine[i]);
}
//si le chiffre dans la chaine temporaire est >10 et <30
if(atoi(chtemp)>10 && atoi(chtemp)<30)
{
//on copie le nombre dans le tableau
tab[j]=atoi(chtemp);
j++;
chtemp=null;
}
//on affecte le compteur i avec le marqueur de fin
i=mfin;
}
}
}
|
|
mercredi 11 novembre 2009 à 16:47:01 |
Re : Extraire entier d'une chaine

CptPingu
|
Pourquoi mets tu des étoiles partout ?
"if (isdigit*(une_chaine[i]))" devrait être "if (isdigit(une_chaine[i]))".
De plus : "char chtemp;" est un caractère, donc tu ne peux pas le mettre à "null" (en plus c'est censé être NULL en majuscule).
Code C/C++ : while(mdeb<strlen*(une_chaine) && !isdigit*(une_chaine[j]))
{
//le marqueur de fin prend l'indice
mfin=j;
}
Ici, tu ne dois pas utiliser j, mais i. De plus tu n'incrémentes pas i, donc tu auras une boucle infinie.
Code C/C++ :
//on parcours alors la chaine entre nos 2 marqueurs
for(mdeb<mfin)
{
strcat(chtemp,*une_chaine[i]);
}
Non, inutile de faire un parcours. Il suffit juste de faire une copie d'une certaine taille, en partant d'un certain indice (via strncpy). Vu que tu n'as pas du voir les pointeurs, on va conserver ta méthode.
Pour que tu puisse faire un strcat, chtemp doit être un chaîne de caractère, et non un caractère.
Pour le reste, ça me semble pas trop mal.
|
|
mercredi 11 novembre 2009 à 17:20:58 |
Re : Extraire entier d'une chaine

Vylco
|
J'ai etudieé les pointeurs mais jme perds toujours un peu qd je les utilises , genre quand est ce qu'on doit mettre une * et quand faut pas en mettre, sinon la fonction strncpy m'a l'air plus adaptée mais je vois pas comment l'utilisée ici.
Sinon jai effectué les changements ce qui donne :
Code C/C++ : void Extraire_Num(char *une_chaine)
{
int i,mdeb,mfin,j;
int tab[100];
char chtemp[100];
j=0;
//parcours de la chaine de caractère
for(i=0;i<strlen(une_chaine);i++)
{
//si on tombe sur un chiffre
if (isdigit(une_chaine[i]))
{
//on affecte le marqueur de début par l'indice
mdeb=i;
i++;
//tant qu'on est pas à la fin de la chaine ou que l'on ne rencontre pas de caractère
while(mdeb<strlen(une_chaine) && !isdigit(une_chaine[i]))
{
//le marqueur de fin prend l'indice
mfin=i;
i++;
}
//on parcours alors la chaine entre nos 2 marqueurs
for(mdeb<mfin)
{
strcat(chtemp,une_chaine[i]);
}
//si le chiffre dans la chaine temporaire est >10 et <30
if(atoi(chtemp)>10 && atoi(chtemp)<30)
{
//on copie le nombre dans le tableau
tab[j]=atoi(chtemp);
j++;
chtemp=NULL;
}
}
}
}
|
|
jeudi 12 novembre 2009 à 11:04:54 |
Re : Extraire entier d'une chaine

CptPingu
|
J'ai etudieé les pointeurs mais jme perds toujours un peu qd je les utilises , genre quand est ce qu'on doit mettre une * et quand faut pas en mettre, sinon la fonction strncpy m'a l'air plus adaptée mais je vois pas comment l'utilisée ici
Lis ceci:
http://0217021.free.fr/Cours/pointeurs.pdf
(Adaptation en C d'un tuto que j'avais écrit en Delphi pour ce site).
Tu as encore pas mal de petit erreur de type. La fonction strcat est mal utilisé. Je t'invite à lire le pdf, et à essayer d'utiliser strncpy, qui est plus adapté.
Code C/C++ :
Tu es sur de ne pas vouloir un while ? Parce qu'un for écrit comme cela, ce n'est pas possible.
|
|
jeudi 12 novembre 2009 à 15:13:53 |
Re : Extraire entier d'une chaine

Vylco
|
yo captain, bon j'ai lu ton pdf et j'ai essayé d'améliorer mon code. J'obtiens plus d'erreur à la compilation mais dès que je tape une chaine dans mon scanf j'ai une erreur de type violation d'accés de lecture.
Aussi quand je donne un parametre a ma fonction Extraire_Num(*ch)je dois mettre char devant sinon j'obtiens une erreur:
'Extraire_Num' : identificateur introuvable
Je dois laisser char tu crois ? bref sa me parait bizard.
Sinon j'ai une question bete je fais comment pour afficher mon tableau (tab) une fois la fonction effectuée ?
Merci encore pour ton aide ^^
Code C/C++ : void main()
{
char *ch;
printf("saisir une chaine alphanumerique\n");
scanf("%s",&ch);
char Extraire_Num(*ch);
}
void Extraire_Num(char *une_chaine)
{
int i,mdeb,mfin,j,k;
int tab[100];
char *chtemp;
chtemp=(char*)malloc(100);
j=0;
//parcours de la chaine de caractère
for(i=0;i<strlen(une_chaine);i++)
{
//si on tombe sur un chiffre
if (isdigit(une_chaine[i]))
{
//on affecte le marqueur de début par l'indice
mdeb=i;
i++;
//tant qu'on est pas à la fin de la chaine ou que l'on ne rencontre pas de caractère
while(mdeb<strlen(une_chaine) && !isdigit(une_chaine[i]))
{
//le marqueur de fin prend l'indice
mfin=i;
i++;
}
//on parcours alors la chaine entre nos 2 marqueurs
while(mdeb<mfin)
{
strncpy(chtemp,&une_chaine[mdeb],100);
mdeb++;
}
//si le chiffre dans la chaine temporaire est >10 et <30
if(atoi(chtemp)>10 && atoi(chtemp)<30)
{
//on copie le nombre dans le tableau
tab[j]=atoi(chtemp);
j++;
chtemp="";
}
}
}
free(chtemp);
}
|
|
jeudi 12 novembre 2009 à 16:18:27 |
Re : Extraire entier d'une chaine

CptPingu
|
char *ch; /* char* ch = malloc(256 * sizeof (char)); */
printf("saisir une chaine alphanumerique\n");
scanf("%s",&ch);
/* free(ch); */
char Extraire_Num(*ch);
Oulah, faut relire le pdf :). Si tu n'alloues pas de mémoire, il ne peut rien mettre dedans.
Ici, inutile d'allouer quoi que ce soit. On va la mettre en dur.
Code C/C++ :
char ch[256];
printf("saisir une chaine alphanumerique\n");
scanf("%s", ch); /* Pas de &, puisque ch n'est pas une variable scalaire (normal), mais un tableau, donc un pointeur */
char Extraire_Num(*ch); /* A effacer, ça n'a rien à faire là ! */
Tu mets ton main, en dessous de la fonction Extraire_Num.
Pour strncpy, il faut faire une soustraction de marqueur, et donc remplacer tes marqueurs de position par des marqueurs d'adresse (quoi qu'on puisse le faire en position).
|
|
jeudi 12 novembre 2009 à 18:21:46 |
Re : Extraire entier d'une chaine

Vylco
|
ptain tu gère  , sa marche sauf que sa me renvoit un résultat bizard, sa doit venir comme tu dit de strncpy.
tu peux m'expliquer ce que tu veux dire par "Pour strncpy, il faut faire une soustraction de marqueur, et donc remplacer tes marqueurs de position par des marqueurs d'adresse (quoi qu'on puisse le faire en position). " parce que j'ai beau chercher je vois pas comment faire.
|
|
Cette discussion est classée dans : chaine, include, extraire, entier, char
Répondre à ce message
Sujets en rapport avec ce message
conversion de chaine en entier [ par bechwiyech ]
Bonsoir j'ai ecris un petit code pour convertir un nombre en un entier. mais ca marche pas , pourriez vous m'aidez. #include #include #include stati
probléme de conversion un chaine AnsiSitring en une chaine char [ par freem1 ]
je programme en c++ builder 6 et il ya un probléme au niveau de la conversion code:[char cl[16];cl = Edit2->Text.c_str();]</font
probleme creation de tableaux à taille dynamique [ par veka61 ]
Bonjour tout le monde,Voila j'essai depuis plusieurs jour de creer une fonction pour transformer un string en char seulement j'obtient une erreur que
concatenation LPCSTR [ par bandifull ]
Bonjour,Je souhaiterai utiliser une fonction activeX qui prend en parametre un LPCSTR.Ce LPCSTR contient deux parties, une chaine de caractere (statiq
votre avis sur une fonction de split... [ par Matt67 ]
Bonsoir,Je dois faire une fonction de "splitage" de chaine. J'ai realisé ce bout de code et j'aimerais votre avis. La fonction n'est pas tout a fait f
plus court chement avec le cout [ par developvbdebut ]
Bonsoir tout le mondeJ'ai un probleme avec l'algo du plus cours chemin, je ne vois pas comment mis prendre. De plus, je dois affichier la distance e
convertir char en const char * [ par noulii ]
Bonjour tout le monde,Ma question est dans la titre, est-il possible de convertir un char en un const char*?Je m'explique.Je recupere des lettres dans
Différence char - string [ par herlockg ]
Bonjour,Voilà, je me demandais quelle était la différence exacte entre le type string et le type char. De plus, il pourquoi n'est-il pas nécessaire d'
Pb récupération chaine de caractères [ par doudou0088 ]
Salut ;)Je voulais savoir comment je pourrais faire pour récuperer le mot entré par l'utilisateur dans la console?J'aimerai garder mon char *mot.Mon c
récupération d'un fichier dans un tableau [ par dgac ]
Bonjour j'ai essayé le code suivant[CODE] #include<
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|