Pointeurs, Tableaux et Chaines... en C.
Résolu/Fermé
mattrse
Messages postés
75
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
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
A voir également:
- Pointeurs, Tableaux et Chaines... en C.
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Tableaux croisés dynamiques - Guide
- Fusionner deux tableaux excel - Guide
- Nouvelles chaînes tv 2024 - Accueil - TV & Vidéo
- Mise en forme tableau word - Guide
2 réponses
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 26/09/2013 à 15:28
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 :
Cela donne :
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
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
mattrse
Messages postés
75
Date d'inscription
jeudi 20 décembre 2007
Statut
Membre
Dernière intervention
26 septembre 2013
10
26 sept. 2013 à 20:35
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 :
Encore merci ! :)
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 ! :)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
26 sept. 2013 à 22:57
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.
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.