Pergunta

Declaro uma matriz de char estática e depois a passo para uma função. Como conseguir o não. de bytes na matriz dentro da função?

Foi útil?

Solução

Você teria que passar para a função. Você pode usar sizeof () para obter o tamanho de uma matriz.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

este Página msdn tem mais sobre o tamanho do SizeOf e tem um exemplo maior.

Editar: * Veja J_Random_Hacker Resposta Para uma técnica intrigante usando modelos ... *

Outras dicas

Use um modelo de função que possua um parâmetro de modelo não do 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
    }
}

Chamar:

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

Uma nova cópia desta função será instanciada para cada tamanho distinto da matriz que ela é chamada; portanto, se você chamá-lo com muitas matrizes de tamanho diferente, você receberá algum código inchaço. Mas não é provável que seja o caso.

Não. Não use matrizes. Use um vetor. Hoje em dia, quase não há desculpa para usar matrizes porque são inseguras. Afaik, eles são uma das principais razões para problemas de software, porque é muito fácil invadir acidentalmente o final da matriz.

Usando um vetor, você não precisa mais se preocupar com excedentes de buffer. E sua função pode descobrir facilmente o tamanho do vecor.

#include <vector>
vector<char> myVector;

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

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

Você também pode 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 pré -C ++ 17 Implementações de amostra de cópia;)

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

Você não pode. Matrizes em C ++ são ponteiros, e isso é tudo que você tem: o ponteiro para o início da matriz. Se for uma corda, você pode usar o Strlen para medir seu comprimento. Se for outro formato conhecido, você pode calcular o comprimento de acordo com esse 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
}

Independentemente do parâmetro da sua função for um char [] ou um char*, você não sabe o tamanho.

Sugiro passar o tamanho como um parâmetro separado.

Uma outra opção que você tem é criar uma classe de string que gerencia a string. Tenho certeza de que alguém já fez isso já. A versão mais primitiva é uma estrutura com um char * e o comprimento do buffer, onde você deve gerenciar manualmente o tamanho sempre que mudar. A outra extremidade do espectro é uma classe de string totalmente implementada, com funções de sobrecarga e manupulação do operador.

Em seguida, passe esta classe para sua função e ela já conhece o tamanho. Não é realmente diferente, então passá -lo como um parâmetro separado; É simplesmente uma maneira mais fácil de gerenciar strings se forem todos diferentes comprimentos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top