Domanda

Dichiaro un array di caratteri statici, quindi lo passo a una funzione. Come ottenere il no. di byte nella matrice all'interno della funzione?

È stato utile?

Soluzione

Dovresti passarlo alla funzione. È possibile utilizzare sizeof () per ottenere le dimensioni di un array.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

Questa pagina MSDN ha spiegato di più circa sizeof e ha un esempio più grande.

Modifica: * vedi la risposta di j_random_hacker per una tecnica intrigante che usa modelli ... *

Altri suggerimenti

Usa invece un modello di funzione che ha un parametro modello non di 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
    }
}

Per chiamare:

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

Verrà istanziata una nuova copia di questa funzione per ogni dimensione distinta di array con cui viene chiamata, quindi se la si chiama con molti array di dimensioni diverse, si otterrà un po 'di codice. Ma non è probabile che sia così.

No. Non usare array. Usa invece un vettore. In questi giorni non ci sono quasi scuse per l'uso di array perché non sono sicuri. AFAIK, sono uno dei motivi principali dei problemi del software perché è così facile sovraccaricare accidentalmente la fine dell'array.

Usando un vettore, non devi più preoccuparti dei sovraccarichi del buffer. E la tua funzione può facilmente scoprire le dimensioni di Vecor.

#include <vector>
vector<char> myVector;

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

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

Puoi anche usare std :: size () da 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';
}

Per le implementazioni di esempio di copia pre c ++ 17;)

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

Non puoi. Le matrici in C ++ sono puntatori, e questo è tutto ciò che hai: il puntatore all'inizio dell'array. Se capita di essere una stringa, puoi usare strlen per misurarne la lunghezza. Se è un altro formato noto, puoi calcolare la lunghezza in base a quel formato.

Considera questo codice:

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
}

Indipendentemente dal fatto che il parametro della funzione sia un carattere [] o un carattere *, non si conosce la dimensione.

Suggerisco di passare la dimensione come parametro separato.

Un'altra opzione che hai è la creazione di una classe di stringhe che gestisce la stringa. Sono sicuro che qualcuno là fuori l'ha già fatto. La versione più primitiva è una struttura con un carattere * e la lunghezza del buffer, in cui è necessario gestire manualmente la dimensione ogni volta che cambia. L'altra estremità dello spettro è una classe di stringhe completamente implementata, con sovraccarico dell'operatore e funzioni di manipolazione.

Quindi passa questa classe alla tua funzione e conosce già la dimensione. Non è poi molto diverso dal passarlo come parametro separato; è semplicemente un modo più semplice di gestire le stringhe se sono tutte di diversa lunghezza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top