Retourné un tableau dans une focntion???

nerone21 Messages postés 108 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mai 2011 - 2 janv. 2007 à 13:26
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 2 janv. 2007 à 19:52
Bonjour,

alors voici mon probleme, et ma fonction:

char *ConcatNom(char NomFichier[MAX_PATH])
{
    int taillefile=strlen(NomFichier);
    char nomfichier[255]={NULL};
    for(int nomFile=taillefile;nomFile>1;nomFile--)
    {
        if(NomFichier[nomFile]=='\\')
        {
            nomFile++;
            for(nomFile,posnom=0;nomFile<taillefile,posnom<taillefile;nomFile++,posnom++)
            {
                if(NomFichier[nomFile]!='0')
                    nomfichier[posnom]=NomFichier[nomFile];
            }
            nomFile=0;
        }
    }
    return nomfichier;
}

en bref elle recoit un chemin en entrée, et a la fin elle doit me renvoyer juste le nom du fichier...
ma fonction marche parfaitement le probleme vient lorsqu'elle me renvoi le "nomfichier".

j'utilise cette fonction a cette occasion:
SendDlgItemMessage (hWndResults, IDC_LISTESUPPR, LB_ADDSTRING, (WPARAM) 0, (LPARAM) (LPCTSTR)ConcatNom(strNomFichier) );

et donc le probleme, c'est que les caracteres que je recois dans ma listbox sont d'une part incomprehensible et ne sont pas ceux ke j'attend, alors si quelqu'un a une idée voire même la solution a mon probleme, je suis preneur car ca doit faire deux heures ke je m'arrache les cheveux la dessus.

merci par avance...

8 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
2 janv. 2007 à 13:42
Tu peux aussi utiliser :
PathFindFileName(lpStrFichier)   // comme ta fonction
PathFindExtName(lpStrFichier)   // que l'extension
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
2 janv. 2007 à 13:47
En plus tu renvois un pointeur local à ta fonction, ça marcherait mieux en passant un buffer que la fonction remplirait.

ex :

char *ConcatNom(char NomFichier[MAX_PATH], char buffer[])
{
    // char nomfichier[255]={NULL}; devient buffer
    // c'est l'appelant qui alloue le buffer
   
   return buffer; // quant même le retour buffer
}

parceque à mon avis tu te sert directement de ce pointeur au retour, c'est là que ça doit clocher.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 janv. 2007 à 13:58
Salut,
On peut retourner le pointeur sur le caractère qui suit le dernier "" du chemin. Voici un petit exemple:
char *ConcatNom(char* NomFichier)
{
    int taille=strlen(NomFichier);
    while(NomFichier[taille]!='\\') taille--;
    taille++;
    return NomFichier+taille;
}
Cette fonction prend comme paramètre le pointeur sur le premier caractère du chemin et renvoie le pointeur sur la première lettre du nom. Le buffer contenant le chemein doit être déclaré en global ou en static dans la fonction appelante.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 janv. 2007 à 17:04
Salut racpp. Ta fonction retourne un pointeur sur le premier
caractère du nom du fichier c'est bien ça? Dans ce cas, y’a sûrement un
meilleur moyen de faire que d’appeler strlen. J'avais fais un snippet la dessus
ici:


char *FileName (char *path)

{
    char *c path, *ret path;

    if(c == 0) return 0;

    while(*c)

    {
        if(*c '\\')  ret c+1;

        c++;

    }

    return ret;

}


Même principe mais on parcours une seul fois la chaîne.


Et puis d'ailleurs:
int taille =strlen(NomFichier);

while(NomFichier[taille]!='\\') taille--;

Tu commence à chercher en dehors du buffer :S









C++ (@++)<!--
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
2 janv. 2007 à 17:13
"int taille= strlen(NomFichier);
while(NomFichier[ taille ]! ='\\') taille--;
Tu commence à chercher en dehors du buffer :S"

J'ai rien dit. J'avais oublié. strlen retourne "longeur de chaine-1" du au caractère de fin de chaine. Honte à moi.

C++ (@++)<!--
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 janv. 2007 à 17:16
On peut aussi utiliser strrchr qui est censée être optimisée

while(NomFichier[taille]!='\\') taille--;
> Attention aussi au cas ou on ne trouvera jamais de '\\'
_____________________________________
Un éditeur de ressources gratuit pour Windows
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 janv. 2007 à 17:51
Sakingdom >> C'est vrai que c'est mieux d'éviter strlen(). J'ai fait ce petit code en quelques secondes à partir du code présenté par l'auteur de la question. Cette fonction est donc à améliorer.
Avec while(NomFichier[taille]!='\\') taille--; la recherche commence depuis le zéro final de la chaine. Ce dernier fait donc bien partie du buffer mais n'est pas pris en compte par strlen() qui retourne le nombre de caractères affichables.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
2 janv. 2007 à 19:52
Version avec strrchr :



size_t result;
char* lpStr = 0;
lpStr = strrchr(szNomFichier, '\\');
 
if( lpStr )
     result = (lpStr-szNomFichier)+1;   // nom fic commence a result
else
     result = 0;  // on a pas trouvé
0
Rejoignez-nous