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 :

Recherche de l'indice où débute une sous chaine dans un char*.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut Recherche de l'indice où débute une sous chaine dans un char*.
    Bonjour,

    J'ai un bug lorsque je recherche l'indice où débute une sous chaine dans un char*.

    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
     
     
    int getIndStrStr (const char *cs, const char *ct) {
    	int index = -1;
     	if (cs != NULL && ct != NULL) {
    		char *ptr_pos = NULL;
    		ptr_pos = strstr (cs, ct);
    		if (ptr_pos != NULL) {
    			index = ptr_pos - cs;
    		}
    	}
    	return index;
    }
     
     
     
    void MaFct() {
         .....
         ........
         char * bufferFichier = new char[size];
         f_in.read(bufferFichier,size);
     
         int ind = getIndStrStr (bufferFichier, "Camera");
         cout  <<  endl << "Enfin voici l'indice => " << ind << endl;
     
    }
    La valeur affiché est -1.
    Cela vient du fait qu'il ne trouve pas "Camera" dans mon buffer (le buffer étant bien rempli).


    Or j'ai écrit ce bout de code pour vérifier que le buffer contient bien la chaine "Camera" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout <<  endl << "Buffer fichier: " << bufferFichier[8390648] << bufferFichier[8390649] << bufferFichier[8390650] << bufferFichier[8390651] << bufferFichier[8390652] << bufferFichier[8390653]  << endl;
    La valeur affiché ici est bien Camera.

    Je ne comprend pas....

    Merci d'avance,
    funky

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La fonction getIndStrStr est correcte.
    Cela vient du fait qu'il ne trouve pas "Camera" dans mon buffer (le buffer étant bien rempli).
    Peut être un '\0' traine dans le buffer avant la sous-chaîne "Camera" ?

    Or j'ai écrit ce bout de code pour vérifier que le buffer contient bien la chaine "Camera" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout <<  endl << "Buffer fichier: " << bufferFichier[8390648] << bufferFichier[8390649] << bufferFichier[8390650] << bufferFichier[8390651] << bufferFichier[8390652] << bufferFichier[8390653]  << endl;
    La valeur affiché ici est bien Camera.
    Ce code n'est pas du C mais du C++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut
    Ce code n'est pas du C mais du C++
    oups désolé pour le cout. Je code en C++ mais je suis obliger de passer par des char* donc d'utiliser la biblio standard du C. C'est pour cela que j'ai posté ce message dans le forum C.

    Merci en effet aprés vérification, il y a bien un \0 avant "Camera"
    donc cela est sans doute une partie du problème.
    Mais alors comment faire ?

    Mais ce n'es pas le seul problème.
    Quand je teste en mettant "Scanning Acquire" (c'est au tout début du buffer - donc pas de \0 avant) cela renvoie toujours -1.


    Merci d'avance

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Merci en effet aprés vérification, il y a bien un \0 avant "Camera"
    donc cela est sans doute une partie du problème.
    Mais alors comment faire ?
    tout simplement en faisant une version un peu modifiée de strstr() qui prend en paramètre la taille du buffer qui sera testée en lieu et place du zéro terminal.

    voici le strstr() de Microsoft rapidement modifié comme indiqué (pas testé... mais bon...):

    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
     
    char * my_strstr (const char * str1, const char * str2, size_t size)
    {
            char *cp = (char *) str1;
            char *s1, *s2;
            size_t n;
     
            if ( !*str2 )
                return((char *)str1);
     
            while (*cp && size)
            {
                    s1 = cp;
                    s2 = (char *) str2;
                    n  = size;
     
                    while (n && !(*s1-*s2) )
                            n--, s1++, s2++;
     
                    if (!*s2)
                            return(cp);
     
                    cp++;
                    size--;
            }
     
            return(NULL);
    }
    C'est juste pour te donner des idées.....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut
    Merci beaucoup.

    En effet ce n'est pas bête. Je vais m'aider de ton code et du code microsoft afin de modifier strstr à ma sauce sans pour autant perdre en optimisation (car le temps d'exécution est autant voir plus important que la fonctionnalité du logiciel que je développe)

    Cela va permettre d'éviter un bug future sans pour autant résoudre mon problème majeur et bizarre.


    Edit: la fonction my_strstr est non fonctionnelle.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut
    Petite précision: le message d'erreur à l'exécution est: "An unexpected error has prevented the operation from finishing (internal failure)"

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par funkyKong Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         char * bufferFichier = new char[size];
         f_in.read(bufferFichier,size);
     
         int ind = getIndStrStr (bufferFichier, "Camera");
         cout  <<  endl << "Enfin voici l'indice => " << ind << endl;
     
    }
    Pas du C... Je déplace ?

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pas du C... Je déplace ?

    Ok pour moi, après tout c'est du C++...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

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

Discussions similaires

  1. rechercher une sous chaine dans une chaine
    Par id.prog dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/01/2009, 17h59
  2. Rechercher une sous chaine dans un chaine
    Par franck06 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 14h53
  3. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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