2011-11-08 18 views
5

I declaran la siguiente matriz:¿Cómo puedo encontrar la longitud de la matriz "char *" en C?

char* array [2] = { "One", "Two"}; 

paso esta matriz a una función. ¿Cómo puedo encontrar la longitud de esta matriz en la función?

+1

estrellas Char == carácter puntero –

+2

Por cierto, el uso de 'I' lugar de 'i' probablemente ayudará a evitar la heurística de" es una pregunta razonable "(además de facilitar la lectura de la pregunta para los hablantes nativos de inglés). – sarnold

Respuesta

17

No puede encontrar la longitud de una matriz después de pasarla a una función sin esfuerzo adicional. Tendrá que:

  1. Utilice un recipiente que almacena el tamaño, tales como vector (recomienda).
  2. Pase el tamaño junto con él. Esto probablemente requerirá la menor modificación a su código existente y será la solución más rápida.
  3. Utilice un valor centinela, como las cadenas C do . Esto hace que encontrar la longitud de la matriz sea una operación de tiempo lineal y si olvida el valor centinela, su programa probablemente se bloquee. Esta es la peor forma de hacerlo en la mayoría de las situaciones.
  4. Use plantillas para deducir el tamaño de la matriz a medida que la pasa. Usted puede leer sobre ello aquí: How does this Array Size Template Work?

En caso de que se preguntan, la mayoría de la gente lamenta el hecho de que las cadenas C funcionan de esta manera.

+0

Así inventaron B strings. –

+0

@MooingDuck link :) Google es madre sobre el tema –

+0

Aparentemente, el nombre correcto es [BSTR] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069 (v = vs.85)) .aspx) (La gente odia estas cadenas más que C) –

6

Cuando pasa una matriz hay NOT una manera fácil de determinar el tamaño dentro de la función.

Usted puede pasar el tamaño de la matriz como un parámetro o uso std :: vector < std :: string>

Si se siente particularmente aventurero puede utilizar some advanced template techniques

En pocas palabras, se ve algo así como

template <typename T, size_t N> 
void YourFunction(T (&array)[N]) 
{ 
    size_t myarraysize = N; 
} 
+0

sí, eso es lo que estoy haciendo actualmente, pero quería eliminar ese parámetro extra. oh bien – bubbles

+0

También hay una clase std :: array . –

+3

@bubbles 'int main (argc, char ** argv)'. Si fuera simple, el main se haría de manera diferente. –

0

If te refieres a cuánto tiempo se agregan todas las cadenas a la criatura.

int n=2; 
int size=0; 
char* array [n] = { "One", "Two"}; 

for (int i=0;i<n;++i) 
    size += strlen(array[i]; 

Agregado:

si eso es lo que estoy haciendo actualmente pero quería eliminar ese extra parámetro de. oh bien -

, probablemente, va a tener una mala respuesta para esto, pero siempre se puede utilizar el primer puntero para almacenar el tamaño, siempre y cuando no se deferencia o equivocación por ser en realidad un puntero.

char* array [] = { (char*)2,"One", "Two"}; 

long size=(long)array[0]; 
for(int i=1; i<= size;++i) 
    printf("%s",array[i]); 

O usted podría NULL terminar su gama

char * array [] = { "uno", "dos", (char *) 0};

for(int i=0;array[i]!=0;++i) 
{ 
    printf("%s",array[i]); 
} 
0

No es posible obtener el tamaño de matriz del puntero. Podría terminar la matriz con un puntero NULL. De esta manera, su función puede buscar el puntero NULL para conocer el tamaño, o simplemente dejar de procesar la entrada una vez que llegue al valor NULL ...

2

C hace algunos trucos detrás de su espalda.

void foo(int array[]) { 
    /* ... */ 
} 

void bar(int *array) { 
    /* ... */ 
} 

Ambos son idénticos:

6.3.2.1.3: Excepto cuando es el operando del operador sizeof o la unario & operador, o es una cadena literal utilizado para inicializar una matriz, una expresión que tiene el tipo '' matriz de tipo '' se convierte en una expresión con el tipo '' puntero para escribir '' que apunta al elemento inicial del objeto de matriz y no es un valor l. Si el objeto de matriz tiene clase de almacenamiento de registro, el comportamiento no está definido.

Como resultado, no se sabe, en el interior o foo()bar(), si usted fuera llamada con una matriz, una porción de una matriz, o un puntero a un solo número entero :

int a[10]; 
int b[10]; 
int c; 

foo(a); 
foo(&b[1]); 
foo(&c); 

algunas personas les gusta escribir sus funciones como: void foo(int *array) sólo para recordarse a sí mismos que no estaban realmente aprobaron una serie , sino más bien un puntero a un entero y puede o no puede haber más enteros en cualquier lugar cercano. A algunas personas les gusta escribir sus funciones como: , para recordar mejor a sí mismos lo que la función espera que se le pase.

Independientemente de la forma que le guste hacerlo, si desea saber cuánto tiempo la matriz es, usted tiene algunas opciones:

  1. pasar a lo largo de una longitud paramenter también. (Piense en int main(int argc, char *argv)).
  2. Diseñe su matriz para que cada elemento no sea NULL, excepto el último elemento . (Piense en char *s="almost a string"; o execve(2).)
  3. Diseñe su función de modo que tome algún otro descriptor de los argumentos . (Piense en printf("%s%i", "hello", 10); - la cadena describe los otros argumentos. printf(3) utiliza el manejo de argumentos stdarg(3), pero podría ser simplemente una matriz.)
+1

trivia: 'argv' hace ambos puntos 1 y 2. – u0b34a0f6ae

Cuestiones relacionadas