Plus simple ?Code:
1
2
3
4
5
6
7
8
9
10
11 /* On détermine d'abord la racine commune */ p = ch2 ; p1 = ch1 ; l = 0 ; while ( (p != NULL) && (p1 != NULL) && (*p == *p1) ) { racine[l] = *p ; p++ , p1++ ; if (*p=='/') l=p; } racine[l] = '\0' ;
Version imprimable
Plus simple ?Code:
1
2
3
4
5
6
7
8
9
10
11 /* On détermine d'abord la racine commune */ p = ch2 ; p1 = ch1 ; l = 0 ; while ( (p != NULL) && (p1 != NULL) && (*p == *p1) ) { racine[l] = *p ; p++ , p1++ ; if (*p=='/') l=p; } racine[l] = '\0' ;
oui, à condition de le mettre avant l'incrémentation et de faire la différence :
au lieu de :
il me semble que ce serait plutôt :Code:if (*p=='/') l=p;
ce qu'on pourrait traduire par :Code:
1
2
3
4
5
6
7
8
9
10
11
12 /* On détermine d'abord la racine commune */ p = ch2 ; p1 = ch1 ; p2 = racine ; l = 0 ; while ( (p != NULL) && (p1 != NULL) && (*p == *p1) ) { *p2 = *p ; if (*p=='/') l=p-ch2+1; p++ , p1++, p2++ ; } racine[l] = '\0' ;
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 int Find_CommonRoot ( char *Filename1, char *Filename2, char Separator, char *Root ) { int l = 0 ; char *Start = Filename1, *pRoot=Root ; while ( (Filename1 != NULL) && (Filename2 != NULL) && (*Filename1 == *Filename2) ) { *pRoot = *Filename1 ; if ( *Filename1 == Separator ) l = Filename1 - Start + 1; Filename1++ , Filenamé2++, pRoot++ ; } Root[l] = '\0' ; return l ; }
[EDIT]
Ton raccourci ne fonctionnera pas à cause du "l" dans la fabrication de la racine.
J'ai modifié pour séparer la fabrication de la racine du calcul de l
[/EDIT]
avec la fonction complémentaire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void Transform_Into_RelativePath ( char *Filename, char *Root, char Separator ) { int l = strlen(Root), l1 ; char *p ; if ( (p = strstr (Filename, Root)) != NULL ) { l1 = strlen(Filename) - l + 1 ; memmove ( &(Filename[3]), &(Filename[l]), l1) ; Filename[l1+3] = '\0' ; Filename[0] = '.' ; Filename[1] = '.' ; Filename[2] = Separator ; } }
2 remarques fnales (la nuit a porté conseil ;))
- Pour la recherche de la racine, on n'a pas besoin de la variable Start.. Comme Root n'est pas incrémenté, au lieu de :
il suffit de mettreCode:if ( *Filename1 == Separator ) l = Filename1 - Start + 1;
Code:if ( *Filename1 == Separator ) l = pRoot- Root + 1;
- Pour la transformation en chemin relatif, on n'a pas besoin de la variable p, ni d'utiliser strstr.. Comme la racine doit se situer au début de la chaîne, il suffit d'utiliser strncmp.. donc au lieu de :
il suffit de mettreCode:if ( (p = strstr (Filename, Root)) != NULL )
Code:if ( strncmp (Filename, Root, l) == 0 )