Retourné un tableau dans une focntion???

Signaler
Messages postés
108
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
5 mai 2011
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
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

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Tu peux aussi utiliser :
PathFindFileName(lpStrFichier)   // comme ta fonction
PathFindExtName(lpStrFichier)   // que l'extension
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"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++ (@++)<!--
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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é