begin process at 2012 05 29 05:41:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Extraire entier d'une chaine


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS

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++ :
for(mdeb<mfin)
{


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

Administrateur CodeS-SourceS


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.

1 2

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&lt


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales