2010-09-24 10 views

Répondre

16

Il n'y en a pas. C'est parce que les tableaux se désintègrent en un pointeur vers le premier élément lors du passage à une fonction.

Vous devez soit passer la longueur vous-même ou utiliser quelque chose dans le tableau lui-même pour indiquer la taille.


D'abord, l'option "passer la longueur". Appelez votre fonction avec quelque chose comme:

int setIncludes (char *includes[], size_t count) { 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax."}; 
setIncludes (arr, sizeof (arr)/sizeof (*arr)); 
setIncludes (arr, 2); // if you don't want to process them all. 

Une méthode sentinelle utilise une valeur spéciale à la fin pour ne pas indiquer plus d'éléments (semblable à \0 à la fin d'un tableau C char pour indiquer une chaîne) et serait quelque chose comme ceci:

int setIncludes (char *includes[]) { 
    size_t count = 0; 
    while (includes[count] != NULL) count++; 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax.", NULL}; 
setIncludes (arr); 

une autre méthode que je l'ai vu utilisé (la plupart du temps pour les tableaux intégrés) est d'utiliser le premier élément comme une longueur (similaire à Rexx variables souches):

int setIncludes (int includes[]) { 
    // Length is includes[0]. 
    // Only process includes[1] thru includes[includes[0]-1]. 
} 
: 
int arr[] = {4,11,22,33,44}; 
setIncludes (arr); 
+0

Donc, comme une valeur maximale? –

+1

En supposant que vous voulez dire le premier, @Mohit, en quelque sorte. L'astuce 'sizeof' vous donnera toujours la longueur du tableau (en supposant qu'il n'ait pas déjà été décomposé en pointeur). La flexibilité est que vous n'êtes pas limité à transmettre cette valeur. Si vous avez un tableau de taille 1000 mais seulement 20 valeurs utiles, vous pouvez passer 20 comme taille. – paxdiablo

+1

Pourquoi transmettez-vous un tableau de 'int' à une fonction qui attend un tableau de' char * '? – caf

0

Vous devez connaître la taille de chaque côté. Une façon serait de passer la taille comme un second paramètre. Une autre façon est de convenir avec l'appelant qu'il/elle doit inclure un pointeur nul comme dernier élément dans le tableau passé de pointeurs.

2

Vous avez deux options:

  1. Vous pouvez inclure un second paramètre, semblable à:

    int main(int argc, char**argv)

  2. ... ou vous pouvez double -null mettre fin à la liste:

    char* items[] = { "one", "two", "three", NULL }

+3

Il est intéressant de noter que dans le cas particulier de 'main (int argc, char * argv [])', la norme C exige que l'appelant passe le nombre de droite * et * inclue un pointeur NULL à 'argv [argc]'. Ceintures et bretelles, c'est vrai, mais ça a du mérite. – RBerteig

1

Il n'y a aucun moyen de déterminer simplement la taille d'un tableau arbitraire comme celui-ci en C. Il a besoin d'informations d'exécution qui ne sont pas fournis de manière standard. La meilleure façon de prendre en charge ceci est de prendre en compte la longueur du tableau dans la fonction en tant qu'autre paramètre.

-2

Et qu'en est-il de la fonction strlen()?

char *text= "Hello Word"; 
    int n= strlen(text); 
OR 
    int n= (int)strlen(text); 
Questions connexes