2010-09-24 20 views

Respuesta

16

No hay ninguno. Esto se debe a que las matrices decaerán a un puntero al primer elemento cuando pasen a una función.

Debe pasar la longitud usted mismo o usar algo en la matriz para indicar el tamaño.


En primer lugar, la opción "pasar la longitud". Llame a su función con algo como:

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. 

Un método centinela utiliza un valor especial al final para indicar no hay más elementos (similar a la \0 al final de una matriz C char para indicar una cadena) y sería algo como esto:

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); 

Otro método que he visto aplicar (en su mayoría para las matrices integrales) es utilizar el primer elemento como una longitud (similar a Rexx las variables madre):

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

¿Al igual que un valor máximo? –

+1

Suponiendo que te refieres al primero, @Mohit, más o menos. El truco 'sizeof' siempre te dará la longitud de la matriz (suponiendo que no se haya descompuesto en un puntero). La flexibilidad es que no estás limitado a pasar ese valor. Si tiene una matriz de tamaño 1000 pero solo 20 valores útiles, puede pasar 20 como tamaño. – paxdiablo

+1

¿Por qué está pasando una matriz de 'int' a una función que espera una matriz de' char * '? – caf

0

Tiene que saber el tamaño de cualquier forma. Una forma sería pasar el tamaño como un segundo parámetro. Otra forma es acordar con la persona que llama que debe incluir un puntero nulo como último elemento en la serie pasada de punteros.

2

Usted tiene dos opciones:

  1. Se puede incluir un segundo parámetro, similar a:

    int main(int argc, char**argv)

  2. ... o usted puede doblar -null finaliza la lista:

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

+3

Curiosamente, para el caso especial de 'main (int argc, char * argv [])', el estándar C requiere que el llamante pase el recuento correcto * y * incluya un puntero NULL en 'argv [argc]'. Cinturones y tirantes, cierto, pero tiene mérito. – RBerteig

1

No hay manera de determinar simplemente el tamaño de una matriz arbitraria como este en C. Se requiere la información de tiempo de ejecución que no se proporciona de una manera estándar.

La mejor manera de admitir esto es tomar la longitud de la matriz en la función como otro parámetro.

-2

¿Y qué ocurre con la función strlen()?

char *text= "Hello Word"; 
    int n= strlen(text); 
OR 
    int n= (int)strlen(text); 
Cuestiones relacionadas