Traitement sur chaine de caractères

Signaler
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
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

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
1
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.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Qu'est-ce-que 'remet' est censé contenir exactement ?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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;
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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 ::.)~
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)