Pregunta

Declaro una matriz de caracteres estática, luego la paso a una función. Cómo obtener el no. de bytes en la matriz dentro de la función?

¿Fue útil?

Solución

Tendría que pasarlo a la función. Puede usar sizeof () para obtener el tamaño de una matriz.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

Esta página MSDN tiene más información sobre sizeof y tiene un ejemplo más grande.

Editar: * vea la respuesta de j_random_hacker para una técnica intrigante usando plantillas ... *

Otros consejos

Utilice una plantilla de función que tenga un parámetro de plantilla que no sea de tipo:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

Para llamar:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

Se creará una nueva copia de esta función para cada tamaño distinto de matriz con el que se llama, por lo que si la llama con muchas matrices de diferentes tamaños, obtendrá un poco de código. Pero ese no es el caso.

No. No uses matrices. Use un vector en su lugar. En estos días casi no hay excusa para usar matrices porque no son seguras. AFAIK, son una de las principales razones de los problemas de software porque es muy fácil invadir accidentalmente el final de la matriz.

Usando un vector, no tiene que preocuparse más por los desbordamientos del búfer. Y su función puede averiguar fácilmente el tamaño del vecor.

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}

int array_size = sizeof (Array) / sizeof (Array [0]);

También puede usar std :: size () de C ++ 17

https://en.cppreference.com/w/cpp/iterator/size

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

Para implementaciones de muestra de copia pre c ++ 17;)

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}

No puedes. Las matrices en C ++ son punteros, y eso es todo lo que tiene: el puntero al comienzo de la matriz. Si resulta ser una cadena, puede usar strlen para medir su longitud. Si se trata de otro formato conocido, puede calcular la longitud de acuerdo con ese formato.

Considere este código:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

Independientemente de si su parámetro de función es un char [] o un char *, no conoce el tamaño.

Sugiero pasar el tamaño como un parámetro separado.

Otra opción que tiene es crear una clase de cadena que gestione la cadena. Estoy seguro de que alguien ya ha hecho esto. La versión más primitiva es una estructura con un char * y la longitud del búfer, donde debe administrar manualmente el tamaño cada vez que cambia. El otro extremo del espectro es una clase de cadena completamente implementada, con funciones de sobrecarga y manipulación de operadores.

Luego pasa esta clase a tu función y ya conoce el tamaño. Realmente no es diferente que pasarlo como un parámetro separado; simplemente es una forma más fácil de administrar cadenas si todas tienen diferentes longitudes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top