Traitement sur chaine de caractères

raoulman Messages postés 40 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 21 avril 2007 - 22 oct. 2006 à 15:11
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 22 oct. 2006 à 22:35
Bonjour,

J'utilise strstr et _strrev pour rechercher un mot dans une chaine. Si je le fais dans mon main, je n'ai pas de problèmes, mais si je le mets dans une fonction que j'appelle dans mon main, cela me cause une violation de partage. Si je ne garde que strstr cela fonctionne. Le problème, c'est que je suis tout petit petit en C et je n'arrive pas à trouver de solutions. Si une bonne âme pouvait m'aider ? Ci-dessous le code.

void recherche (char * chaine, char * occurence) {

char * renverse, * remet, * coupe_chaine;
int compte, compte2, reste;
unsigned char * coupe;

coupe_chaine = strstr (chaine, occurence);

compte = strlen (coupe_chaine);

compte2 = strlen (occurence);

reste = compte - compte2;

renverse = _strrev (coupe_chaine);

coupe = _mbsninc ((const unsigned char *)renverse, reste);

remet = _strrev ((char *)coupe);

printf ("%s\n", remet);
}


void main () {

recherche ("test de recherche d'un mot dans une chaine", "mot");

}

9 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
22 oct. 2006 à 15:43
strstr() retourne un const char* donc on ne peut pas écrire dessus,ce que tu veux faire avec _strrev : il faudrait copier la chaîne d'abord. Dans ce cas, pense à initialiser coupe_chaine avec assez de place. De plus, tu devrais sécuriser un peu le code (si strstr retourne un pointeur null ou ne trouve pas l'instance etc...).
Bonne prog.

PS : j'ai testé avec strcpy ça ne plante pas
0
raoulman Messages postés 40 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 21 avril 2007 1
22 oct. 2006 à 16:08
Merci pour ton aide juju12 mais une petite question, tu fais ton strcpy avec "coupe_chaine" ou "remet" en source ?
Parce que ce que je désire récupéré c'est ce que contient "remet" et si j'essaye un strcpy dans ma fonction "recherche" j'ai toujours un plantage.
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
22 oct. 2006 à 16:32
Qu'est-ce-que 'remet' est censé contenir exactement ?
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
22 oct. 2006 à 16:45
Parce que ta fonction telle qu'elle contient des trucs intuiles : tu isoles le mot que tu cherches alors qu'en fait tu l'as déjà dans 'occurence'. En fait on peut tout remplacer par un truc genre:

char* pFndStr=strstr(chaine,occurence);
if(pFndStr&&(pFndStr!=chaine))
{
   printf("%s\n",occurence);
}
return;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 17:59
char *pFndStr=strstr(chaine,occurence);

if(pFndStr != 0) // si la chaine n'est pas égal a zero
    *(pFndStr+strlen(occurence)) = 0; // chaine trouvé et on ajoute 0 final
else // sinon
    return; // pas trouvé la chaine on quitte

C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 18:45
Ok je comprend vaguement ce que tu veux faire. J'ai refais la fonction. Si l'occurence est trouvé, elle l'affiche et retourne 1. Sinon, elle affiche "occurence non trouve" et retourne 0:

int recherche (char * chaine, char * occurence)
{
    char *c, buffer[256];    int len 0, pos 0, retval = 0;

    while(occurence[len] != 0) len++;

    c = strstr(chaine, occurence);

    if(c != 0)
    {
        while(pos < len)
        {
            buffer[pos] = c[pos];
            pos++;
        }

        buffer[pos] = 0;

        printf("%s\n", buffer);
        retval = 1;
    }
    else
        printf("occurence non trouve\n");

    return retval;
}

C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 18:50
Cependant, attention. Dans cette fonction, on suppose qu'occurence ne pèsera jamais plus de 255 caractères. Si il y en a plus, il y aura débordement tampon.

C++ (@++)
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
22 oct. 2006 à 21:41
il a déjà sa chaine « occurence », pourquoi la dupliquer s'il la trouve!?
dans le code de SAKingdom, il n'a qu'a faire :: printf("%s\n", occurence); dans son while(), pourquoi copier occurence dans buffer ???


juju12, en C, strstr() retourne un « char* », pas un « const char* »


char* __cdecl strstr(const char* string, const char* substr);






~(.:: NitRic ::.)~
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 oct. 2006 à 22:35
Dans ce context, il n'y a aucun interet. D'ailleur, si il ne veut que faire ça (tester si la valeur est présente), même pas besoin de créé une fonction. Suffit simplement de tester le pointeur retourné et voilà. Cependant, cette fonction pourrait s'avérer utile si on récupère quelque chose en plus qui se situe après (ou avant qui sais) l'occurence. Mais ici, c'est inutile en effet.

C++ (@++)
0
Rejoignez-nous