Pointeurs, Tableaux et Chaines... en C.

Résolu/Fermé
mattrse Messages postés 70 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 26 septembre 2013 - Modifié par mattrse le 25/09/2013 à 18:13
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 sept. 2013 à 22:57
Bonjour à tous !

J'ai un problème à résoudre en C mais j'ai quelques difficultés.

Pour explication, dans le main, je déclare un tableau comme ceci :

char* tabArgv[500]={
"home",
"toto",
"devoirs",
"maths",
"zero.txt"};
int nbArg=5;

Puis j'appelle ma fonction chemin comme ceci :
 chemin(nbArg,*tabArgv);

Voici la fonction chemin :
int chemin(int argc, char **argv) 
{
if(argc==0)
{
printf("Erreur, vous devez fournir au moins 1 parametre.");
return 1;
}
else if(argc==1){
char* str[256];
strcpy(*str,".");
}
else
{ char* str[256];
int i;
strcpy(*str,".");
for(i=0;i<argc;i++){
strcat(*str,"/");
strcat(*str,&(argv[i]));
}
}
printf("str = %s\n",*str);
return 0;
}

Dans le tableau il y a donc différents noms de repertoire, que je dois concaténer dans l'ordre dans la chaîne str. Enfin, la chaîne doit être affiché.
J'aimerais que le résultat soit :
./home/toto/devoirs/maths/zero.txt
mais il n'en est rien.
Soit ça plante, soit je n'ai pas ce que je souhaite.

J'admet que je suis un peu perdu, j'ai un pointeur vers un tableau de chaînes de caractères que j'envoi à une fonction. C'est un peu too much après avoir fait du Java pendant longtemps(que c'est facile avec ce langage).
Bref, j'attends vivement vos réponses afin de comprendre ce qu'il se passe.
Merci d'avance !

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 26/09/2013 à 15:28
Salut mattrse,

Tu te compliques la vie.

Si tout ce que dois faire ta fonction c'est afficher le chemin reconstitué, cela ne sert à rien de stocker la chaîne dans str, il suffit d'afficher successivement les différents éléments du tableau de pointeurs sur des chaînes.

Simplement, comme cela :

#include <stdio.h>
#include <stdlib.h>

int chemin(int nbArg, char **tabArgv)
{
int n;

if (nbArg == 0)
{
printf("Erreur, vous devez fournir au moins 1 parametre.");
return 0;
}
printf("./");
for (n = 0; n < nbArg; n++)
{
printf(tabArgv[n]);
if (n != nbArg - 1)
printf("/");
}
return 1;
}

int main(void)
{
char* tabArgv[500] =
{ "home", "toto", "devoirs", "maths", "zero.txt" };
int nbArg = 5;

if (chemin(nbArg, tabArgv))
return EXIT_SUCCESS;
else
return EXIT_FAILURE;
}

Cela donne :

./home/toto/devoirs/maths/zero.txt

Si pour une raison ou une autre, tu dois utiliser str, déclare str au début de ta fonction (et non pas dans des accolades internes, qui ne donnent à la variable qu'une portée locale). C'est la même chose en Java, sauf erreur.

S'agissant de ta chaîne str, fais y référence dans les fonctions de manipulation de chaîne comme étant "str" et non "*str", car celles-ci attendent des pointeurs et non pas un pointeur déréférencé.

Stocker cela dans une chaîne str dans ta fonction me paraît inutile, car tu n'en fais rien, à part afficher le résultat.

S'agissant des return de ta fonction, s'ils signifient vrai ou faux, comme je le pense, en C faux est 0, et vrai toute autre valeur (1, par exemple).

J'ai aussi changé les noms des arguments à ta fonction, car ils rappellent étrangement ceux de main, et ce me met mal à l'aise. mais c'est de l'ordre de l'irrationnel, j'imagine :-)


Dal

Edit : coquille EXIT_SUCCESS / EXIT_FAILURE
1
mattrse Messages postés 70 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 26 septembre 2013 10
26 sept. 2013 à 20:35
Tout d'abord merci pour ta réponse Dal !

J'ai oublié d'indiquer quelque chose (rah moi qui pensait avoir tout dit !). Je suis dans l'obligation d'utiliser la fonction de concaténation strcat.
Pour tout expliquer, c'est un exercice que j'ai à faire en TD (je suis en DUT Info) et je crois comprendre que les profs veulent nous faire utiliser le c pour faire du système. Bien sûr j'ai sollicité mon prof' TD mais il ne m'a pas beaucoup aidé (il y a des profs comme ça..).

En tout cas, j'ai repris ton code, Dal, et j'ai integré l'utilisation de strcat. Voici ce que ca donne :

int chemin(int nbArg, char **tabArgv) // 4)
{
int n;
char* str[500];
strcpy(str,"./");
if (nbArg == 0)
{
printf("Erreur, vous devez fournir au moins 1 parametre.");
return 0;
}
for (n = 0; n < nbArg; n++)
{
strcat(str,tabArgv[n]);
strcat(str,"/");
}
printf("%s",str);
return 1;
}

Encore merci ! :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 sept. 2013 à 22:57
Et il est où le main() ? S'il s'agit de chemin, tu dois intervertir return 0 et return 1.
Attention à ton type char *str[500]. Il s'agit d'un tableau de pointeurs sur char et tu le traites comme un tableau. Mets plutôt : char str[500];
Pour les printf(), n'oublie pas '\n' en fin de chaîne ou alors il faudra mettre un flush.

Et enfin, pour bien faire, il faudrait vérifier que str peut stocker un élément avant de faire un strcat, sinon cela peut engendrer un segfault.
0