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?
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?
No puede encontrar la longitud de una matriz después de pasarla a una función sin esfuerzo adicional. Tendrá que:
vector
(recomienda).En caso de que se preguntan, la mayoría de la gente lamenta el hecho de que las cadenas C funcionan de esta manera.
Así inventaron B strings. –
@MooingDuck link :) Google es madre sobre el tema –
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) –
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;
}
sí, eso es lo que estoy haciendo actualmente, pero quería eliminar ese parámetro extra. oh bien – bubbles
También hay una clase std :: array
@bubbles 'int main (argc, char ** argv)'. Si fuera simple, el main se haría de manera diferente. –
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]);
}
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 ...
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:
int main(int argc, char *argv
)).NULL
, excepto el último elemento . (Piense en char *s="almost a string";
o execve(2)
.)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.)trivia: 'argv' hace ambos puntos 1 y 2. – u0b34a0f6ae
utilizar el nuevo C++ 11 std :: gama
http://www.cplusplus.com/reference/stl/array/
la matriz estándar tiene el tamaño de su método de búsqueda de
estrellas Char == carácter puntero –
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