1 votes

Passer des pointeurs à la fonction

J'ai un doute dans mon programme

#include<stdio.h>

int myFunc(char **);
main()
{
    char *a[2]={"Do","While"};
    myFunc(a);
}

int myFunc(char **P)
{
    /* Here I want to print the strings passed but I'm unable to
       print the strings I just tried the below statement which
       printed just the first letter which is 'D'*/
       printf("%c",**P);
}

quand j'ai essayé

printf("%s",**P);

J'obtiens une erreur d'exécution. Quelqu'un peut-il m'aider ?

Merci Madhu

11voto

Cătălin Pitiș Points 10520

Mettez la taille comme paramètre pour permettre à la fonction de savoir combien de chaînes vous avez dans votre tableau. Ensuite, vous devez itérer le tableau et imprimer chacune d'entre elles.

int myFunc( char** p, int size)
{
  for( int i = 0; i < size; ++i)
  {
     printf("%s", p[i]);
  }
}

Modification ultérieure (comme demandé :-) )

int main( int, char**)
{
   char *a[2]={"Do","While"};
   myFunc( a, 2); // Could be myFunc( a, sizeof(a)/sizeof(char*));
   // ...
   return 0; 
}

8voto

qrdl Points 17813

Trop d'étoiles - essayez

printf("%s",*P);

Et vous avez besoin %s spécificateur de format - %c est juste pour un seul caractère.

Si vous voulez imprimer toutes les chaînes de caractères, vous devez passer le nombre de chaînes de caractères dans le tableau et ensuite imprimer ces chaînes de caractères dans la boucle.

Vérifiez le code suggéré par Cătălin Pitiș. Pour passer le nombre de chaînes de caractères, vous appelez la fonction comme ceci :

myFunc(a, sizeof(a)/sizeof(a[0]));

5voto

sharptooth Points 93379
for( int i = 0; i < 2; i++ ) {
    char* string = P[i];
    printf( "%s", string );
}

Et vous devriez utiliser un moyen de passer la taille du tableau dans la fonction - soit la passer comme un paramètre int,

int myFunc(char **P, int size)
{
    for( int i = 0; i < size; i++ ) {
        //whatever here
    }
}

ou toujours ajouter une valeur nulle au tableau et ne boucler que jusqu'à ce que vous trouviez cette valeur nulle.

char* array[] = { "String1", "String2", 0 };

Sinon, vous aurez un code difficile à maintenir.

4voto

stefanB Points 27796

J'aime les tableaux terminés par nil (0) dans le style objective-c :

void myFunc(char **P)
{
    while (*P)                   // loop to iterate over all strings until 0
       printf("%s\n",*P++);      // print and move to next element in array
}

int main()
{
    char *a[]={"Do","While",0};  // added 0 to null terminate array,
    myFunc(a);                   // kind of like string
}

Sortie :

Do
While

1voto

RBerteig Points 23331

Tout d'abord, la bonne nouvelle : le type de a est équivalent à char ** donc vous passez un paramètre valide à myFunc() .

Le premier problème est que %c est un spécificateur de format qui signifie imprimer un seul caractère. Puisque **P est une expression qui s'évalue à un seul caractère, votre première version fait exactement ce que vous lui avez demandé de faire. Ce n'est pas ce que vous voulez.

La deuxième version est proche de la syntaxe correcte. Elle devrait se lire printf("%s", *P) , donde *P est une expression qui évalue un pointeur vers une chaîne ASCII à terminaison nulle. Dans ce cas, il s'agit de "Do". Cette version n'imprimera pas les deux chaînes.

Même s'il est vrai que le nom d'un tableau est identique à un pointeur vers son premier élément, il s'agit d'une sorte de "mensonge aux étudiants". Passer un tableau à une fonction ne transmet pas et ne peut pas transmettre la longueur du tableau. Pour cela, il faut soit un second argument contenant la longueur, soit une convention comme le nul-terminateur sur une chaîne de caractères pour indiquer la fin du tableau. Avec ce changement, vous pouvez modifier myFunc() pour utiliser une boucle sur les éléments passés et imprimer chacun d'entre eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X