2012-04-24 4 views
26

Mam tablicę int i potrzebuję znaleźć liczbę elementów w nim. Wiem, że ma to coś wspólnego z sizeof, ale nie jestem pewien, jak go dokładnie użyć.Jak mogę znaleźć liczbę elementów w tablicy?

+5

Spójrz na to. http://stackoverflow.com/questions/4081100/c-finding-the-number-ofements-elements-in-an-array – twain249

+0

Jeśli korzystasz z MSVC, masz _countof –

+0

Podczas gdy każdy ma rozwiązanie, chcę zwróć uwagę, że jest bardzo prawdopodobne, że nie ma możliwości znalezienia rozmiaru tablicy dynamicznej, chyba że nagrałeś rozmiar, ponieważ sizeof (a) wskaźnika a jest wielkością wskaźnika 'int * a = new int [10] ] 'w tym przypadku znalezienie' sizeof (* a) 'ma 4 bajty. Dlatego ważne jest, aby sprawdzać rozmiar tablicy. – CppLearner

Odpowiedz

12
int a[20]; 
int length; 
length = sizeof(a)/sizeof(int); 

i można go używać w inny sposób, aby kod nie może być zakodowany do int

powiedzieć, czy masz tablicę array

wystarczy:

int len = sizeof(array)/sizeof(array[0]); 
31

Jeśli masz macierz w zasięgu, możesz użyć sizeof, aby określić jej rozmiar w bajtach i użyć podziału, aby obliczyć liczbę elementów:

#define NUM_OF_ELEMS 10 
int arr[NUM_OF_ELEMS]; 
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]); 

Jeśli otrzymasz tablicę jako argument funkcji lub przydzielić tablicę w stercie nie można określić jego rozmiar używając sizeof. Będziesz musiał przechowywać/przekazać informacje o rozmiarze jakoś, aby móc z niego korzystać:

void DoSomethingWithArray(int* arr, int NumOfElems) 
{ 
    for(int i = 0; i < NumOfElems; ++i) { 
     arr[i] = /*...*/ 
    } 
} 
5

Osobiście uważam, że sizeof (a)/sizeof (* a) wygląda czystsze.

ja też wolą określenie go jako makro:

#define NUM(a) (sizeof(a)/sizeof(*a)) 

Wtedy można go użyć w for-pętle, wygląda następująco:

for (i = 0; i < NUM(a); i++) 
+5

Możesz to zrobić, ale spowoduje to obliczenie rozmiaru za każdym razem, gdy wykona test w pętli for, czyli po każdej iteracji. I tak robiłby podział za każdym razem, gdy byłby w pętli. Byłoby bardziej skuteczne przypisanie wyniku 'NUM (a)' do zmiennej instancji tuż nad pętlą i użycie tej wartości w pętli. – Gavin

+5

@Gavin nie, nie obliczyłby rozmiaru dla każdej iteracji. Kompilator jest wystarczająco inteligentny, aby zobaczyć, że wyniki każdego rozmiaru oraz podziału są stałe i określają wynik w czasie kompilacji, który następnie kompiluje do kodu jako stała liczba. Być może wprowadziłeś w błąd przez wygląd aplikacji 'sizeof', która wygląda jak funkcja z powodu nawiasów, ale nie jest funkcją. 'sizeof' jest operatorem, a nawiasy są tylko konwencją. – blubberdiblub

-2
template <typename Type, int N> 
inline int getElementCount(Type (&array)[N]) 
{ 
    (void)array; // (required to avoid a spurious warning in MS compilers) 
    (void)sizeof(0[array]); // This line should cause an error if you pass an object with a user-defined subscript operator 
    return N; 
} 
+1

Niewłaściwy język. –

1

Użyłem następujący kod jak zasugerowano powyżej do oceny liczby elementów w mojej dwuwymiarowej tablicy:

#include <stdio.h> 
#include <string.h> 

void main(void) 
{ 
    char strs[3][20] = 
    { 
     {"January"}, 
     {"February"}, 
     {""} 
    }; 

    int arraysize = sizeof(strs)/sizeof(strs[0]); 

    for (int i = 0; i < arraysize; i++) 
    { 
     printf("Month %d is: %s\n", i, strs[i]); 
    } 

} 

To działa ładnie. O ile wiem, nie można mieszać różnych typów danych w tablicach C, a także powinieneś mieć taki sam rozmiar wszystkich elementów tablicy (jeśli mam rację), dlatego możesz skorzystać z tego z tą małą sztuczką:

  1. liczba liczba bajtów z sizeof (funkcja) z całym 2d tablicy (w tym przypadku 3 x 20 = 60 bajtów) Numer
  2. liczba bajtów z sizeof() funkcję z pierwszych Strs elementowa tablica [0] (w ten przypadek 20 bajtów)
  3. podzielić cały rozmiar z rozmiaru jednego elementu, co daje liczbę elementów

To przecięcie powinno być przenośne dla tablic 2d w C, jednak w innych językach programowania nie mogło by działać, ponieważ można używać różnych typów danych w tablicy o różnych rozmiarach (jak w JAVA).

3

Nie można znaleźć liczby elementów w tablicy, chyba że jest to tablica znaków. Rozważmy poniższy przykład:

int main() 
{ 
    int arr[100]={1,2,3,4,5}; 
    int size = sizeof(arr)/sizeof(arr[0]); 
    printf("%d", &size); 
    return 1; 
} 

Powyższa wartość daje nam wartość 100, nawet jeśli liczba elementów wynosi pięć. Jeśli jest to tablica znaków, możesz przeszukiwać liniowo łańcuch zerowy na końcu tablicy i zwiększać licznik w miarę przechodzenia.

+0

Chciałem napisać: printf ("% d", size); '. Ale masz rację, możesz znaleźć tylko określony rozmiar tablicy, a nie rzeczywisty rozmiar! – uetoyo

2
#include<stdio.h> 
int main() 
{ 
    int arr[]={10,20,30,40,50,60}; 
    int *p; 
    int count=0; 

    for(p=arr;p<&arr+1;p++) 
     count++; 

    printf("The no of elements in array=%d",count); 

    return 0; 
} 

wyjściowy = 6

OPIS

p jest wskaźnik do tablicy 1-D, i w pętli for(p=arr,p<&arr+1;p++) że wykonany p wskaż adresu bazowego . Załóżmy, że jego adres bazowy to 1000; jeśli zwiększymy wartość o p, to wskaże ona 1002 i tak dalej. Teraz przychodzący do pojęcia &arr - W zasadzie reprezentuje on całą tablicę, a jeśli dodamy 1 do całej tablicy, tj. &arr+1, podaje ona adres 1012, tj. Adres następnej tablicy 1-D (w naszym przypadku rozmiar int jest 2), więc warunek staje się 1000 < 1012.

więc w zasadzie warunek staje się

for(p=1000;p<1012;p++) 

a teraz sprawdzić stan i policzyć wartość

  • 1st czas p=1000 i p<1012 warunek jest true: wprowadzić w pętli zwiększamy wartość count do 1.
  • 2 raz p=1002 i p<1012 warunek jest true: wprowadzić w pętli zwiększamy wartość count do 2.
  • ...
  • 6-te czas p=1010 i p<1012 warunek jest true: wprowadzić w pętli zwiększamy wartość count do 6.
  • Ostatni raz p=1012 i p<1012 warunek jest fałszywy: drukowanie wartości count=6 wOświadczenie.
+0

To nie działa (przynajmniej w C++). Będziesz musiał rzucić '& arr + 1' na (int *) w ten sposób:' for (p = arr; p <(int *) (& arr + 1); p ++) ' – Staszek

-1

W rzeczywistości nie ma właściwego sposobu zliczania elementów w dynamicznej tablicy całkowitej. Jednak polecenie sizeof działa poprawnie w systemie Linux, ale nie działa poprawnie w systemie Windows. Z punktu widzenia programisty, nie zaleca się używania sizeof do pobierania liczby elementów w tablicy dynamicznej. Powinniśmy śledzić liczbę elementów podczas tworzenia tablicy.

+0

Operator' sizeof' zwróci tylko * rozmiar * tablicy * zadeklarowanej w tym samym zakresie *, w przeciwnym razie 'sizeof' po prostu zgłasza rozmiar * wskaźnika *, do którego tablica została przekonwertowana po przekazaniu jako parametr. Nie ma to nic wspólnego z systemem operacyjnym i nie ma zaleceń dotyczących używania 'sizeof' na żadnym z innych niż zrozumienie, co bierzesz' sizeof'. (* gra nie jest przeznaczona *). –

-1

Najczęściej znaleźli prosty sposób wykonać długość tablicy wewnątrz pętli, tak jak tego

int array[] = {10, 20, 30, 40}; 
int i; 
for (i = 0; i < array[i]; i++) { 
    printf("%d\n", array[i]); 
} 
0

Jeśli nie znamy liczbę elementów w tablicy i gdy wejście jest podana przez użytkownik w czasie wykonywania. Wtedy możemy napisać kod jak

kod C:

while(scanf("%d",&array[count])==1) { 
    count++; 
} 

C++ KOD:

while(cin>>a[count]) { 
    count++; 
} 

Teraz liczba będzie o zliczania liczby elementów tablicy, które zostały wprowadzone.