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 Discussion :

récuperer un entier dans un chaine


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut récuperer un entier dans un chaine
    Bonjour;

    J'ai une chaine de caractères comme suit :

    chaine =863&parentId=863', 863, true, 'iv', 'fullscreen=yes,location=no,scrollbars=yes,menubars=no,toolbars=no,resizable=yes');; return false;" oncontextmenu='return false;'>

    je dois récuperer seulement la chaine "863" juste avant le car "&" et supprimer le reste.

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Il y a deux réponses possibles à ta question :

    1) Soit il s'agit de la seule chaîne à analyser, et dans ce cas, pourquoi ne pas toi-même reprendre la chaine "863" ?

    2) Soit il ne s'agit pas de la seule chaîne à analyser et il s'agit donc d'analyser plusieurs chaînes du même style.
    Mais dans ce cas, ta question, posée tel quelle, est trop imprécise. Il nous faut connaitre le format exact de tes chaînes à analyser. Est-il pareil pour toutes ?
    Si le format est pareil pour toutes, et par conséquent s'il s'agit de récupérer le premier nombre trouvé et de le stocker dans une autre chaîne, on peut faire quelque chose du style (à adapter selon tes besoins) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <stdio.h>
    #include <ctype.h>
     
    int main(void)
    {
    	char texte[]="chaine =863&parentId=863', 863, true, 'iv', 'fullscreen=yes,location=no,scrollbars=yes,menubars=no,toolbars=no,resizable=yes');; return false;\"";
    	char nombre[10];
     
    	char * ptexte = texte ;
    	char * pnombre = nombre ;
     
    	while ( *ptexte && !isdigit(*ptexte) )
    		ptexte++;
    	while ( isdigit(*ptexte) )
    	{
    		*pnombre = *ptexte ;
    		pnombre++;
    		ptexte++;
    	}
    	*pnombre = '\0' ;
     
    	printf("chaine a analyser : %s\n" , texte );
    	printf("nombre recupere : %s\n" , nombre );
     
    	return 0;
    }

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Disons que la chaîne soit tout simplement : "chaine =863&parentId='863'". Remarquons bien la présence d'espace avant le caractère = et son absence après. Pour lire le 863 qui suit on pourra écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char * s = "chaine =863&parentId='863'";
    int n;
    sscanf(s, "chaine =%d", &n);
    printf("n = %d\n", n); /* Affiche n = 863 */

  4. #4
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Les réponses donnes sont bonnes mais ne répondent pas formellement a ce qui a été demandée (elles partent de principes implicite).

    Si on pars du principe que tu dois obtenir le nombre située avant un caractère défini, je propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int     my_search(char *str, char marqueur)
    {
      int   index   = 0;
      int   len     = 0;
      char  *nb     = NULL;
     
      while (str[index] != 0)
        {
          if (str[index] == marqueur)
            {
              --index;
              len = 0;
              while ((index != 0) && (str[index] <= '9' && str[index] >= '1'))
                {
                  --index;
                  ++len;
                }
              if ((nb = malloc(sizeof(char) * len + 1)) == NULL)
                return (-1);
              nb[len] = 0;
              strncpy(nb, &(str[index + 1]), len);
              return (atoi(nb));
            }
          ++index;
        }
      return (-1);
    }
    Je n'ai pas teste mais ca devrais être good.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Bonjour;

    Merci pour vos réponse.
    Je pense que je me suis mal exprimé mais Sloshy a raison, le but étant de récupérer la chaine avant "&" que je ne connais pas.
    Sinon je pensais à une solution avec des fonctions strstsr ou autres mais pas un traitement car par car.
    Mais bon ce n'est pas grave je vais testé la fonction proposée par Sloshy.

    En vous remerciant.

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    C'est toujours possible avec scanf. En reprenant le même exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char * s = "chaine =surprise !&parentId='863'";
    char buffer[20+1];
    sscanf(s, "chaine =%20[^&]", buffer);
    printf("%s\n", buffer); /* Affiche : surprise ! */
    %[^&] signifie lire tout jusuq'à ce que l'on rencontre un &. En inscrivant 20 entre le % et le [...], on dit qu'on ne veut lire que 20 caractères au maximum.

  7. #7
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Melem, il faut traiter la chaine apres non?
    Pour ma pars, la fonction retourne un entier (donc ca fonctionne tant que tu le nombre depasse pas la borne superieur d'un entier (2 milliards sur les archi/OS 32 bits généralisé)
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Bin dans ce cas ce que j'ai proposé dans ma première réponse était déjà bon ! J'avoue être un peu perdu là.

  9. #9
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Attendons sont retour ainsi
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    int		CountSize(char *str, char c) // ici tu passes ta chaine et ton caractrere sur lequel tu souhaites t'arreter
    {
    	int	i = 0;
     
    	while (str[i] != c && str[i] != '\0')
    	{
    		i++;
    	}
    	return(i);
    }
     
    char		*fillStr(char *src, char *res, char c) // tu copies 
    {
    	int	i = 0;
    	int	j = 0;
     
    	while(src[i] != '=')
    	{
    		i++;
    	}
    	i ++;
    	while(src[i] != c && src[i] != '\0')
    	{
    		res[j] = src[i];
    		j++;
    		i++;
    	}
    	res[j] = '\0';
    	return(res);
    }
     
    int		main(char *str) //admettons que tu ais ta chaine en parametre pour faire plus simple
    {
     
    	char	*newStr;
     
    	newStr = malloc(CountSize * sizeof(str + 1)); // tu malloc plus 1 pour etre sur
    	newStr = fillStr(str, newStr, '&');
     
    	// à partir de là tu peux utiliser newStr :)
     
    }
    Ce que moi je ferais (désolé, je n'ai pas testé j'ai fais ça vite et je ne peux pas tester ^^ il y a p-e une erreur cachée quelque part).

    J'espère pouvoir aider :]

Discussions similaires

  1. récuperer un caractere dans une chaine
    Par amill dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2007, 17h16
  2. inserer un entier dans une chaine de caractere
    Par thonyitii dans le forum C
    Réponses: 11
    Dernier message: 02/01/2007, 22h00
  3. Premiere occurence d'un entier dans une chaine
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h04
  4. Réponses: 10
    Dernier message: 10/10/2005, 20h46
  5. Récuperer un nombre dans une chaine de caractère
    Par ColonelHati dans le forum C
    Réponses: 4
    Dernier message: 27/04/2005, 14h50

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