2012-04-24 74 views
26

Tôi có một mảng int và tôi cần tìm số phần tử trong đó. Tôi biết nó có cái gì đó để làm với sizeof nhưng tôi không chắc chắn làm thế nào để sử dụng nó một cách chính xác.Tôi làm cách nào để tìm số phần tử trong một mảng?

+5

Hãy xem điều này. http://stackoverflow.com/questions/4081100/c-finding-the-number-of-elements-in-an-array – twain249

+0

Nếu bạn đang sử dụng MSVC, bạn có _countof –

+0

Mặc dù mọi người đều có giải pháp, tôi muốn chỉ ra rằng rất có thể là không có cách nào để tìm kích thước của một mảng động trừ khi bạn đã ghi kích thước bởi vì sizeof (a) của con trỏ a là kích thước của con trỏ 'int * a = new int [10 ] 'trong trường hợp này tìm' sizeof (* a) 'là 4 byte. Vì vậy, điều quan trọng là phải kiểm tra kích thước mảng của bạn. – CppLearner

Trả lời

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

và bạn có thể sử dụng một cách khác để làm cho mã của bạn không được mã hóa cứng để int

Say nếu bạn có một mảng array

bạn chỉ cần:

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

Nếu bạn có mảng trong phạm vi, bạn có thể sử dụng sizeof để xác định kích thước của nó theo byte và sử dụng phép chia để tính số phần tử:

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

Nếu bạn nhận được một mảng như một đối số chức năng hoặc cấp phát một mảng trong đống bạn không thể xác định kích thước của nó bằng cách sử dụng sizeof. Bạn sẽ phải lưu trữ/vượt qua thông tin kích thước bằng cách nào đó để có thể sử dụng nó:

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

Cá nhân tôi nghĩ rằng sizeof (a)/sizeof (* a) trông sạch hơn.

Tôi cũng thích để xác định nó như là một vĩ mô:

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

Sau đó, bạn có thể sử dụng nó trong cho-vòng, thusly:

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

Bạn có thể làm điều này, nhưng nó sẽ dẫn đến việc tính toán kích thước mỗi khi nó thực hiện kiểm tra trong vòng lặp for, vì vậy mỗi lần lặp lại. Và do đó, nó sẽ làm phân chia mỗi lần duy nhất qua vòng lặp. Sẽ có hiệu quả hơn khi gán kết quả của 'NUM (a)' cho một biến mẫu ngay phía trên vòng lặp và sử dụng giá trị đó trong vòng lặp. – Gavin

+5

@Gavin không, nó sẽ không tính kích thước cho mỗi lần lặp lại. Trình biên dịch đủ thông minh để thấy rằng kết quả của mỗi sizeof cũng như phân chia là hằng số và xác định kết quả tại thời gian biên dịch, sau đó nó biên dịch thành mã như một số không đổi. Bạn có thể đã bị lừa bởi giao diện của ứng dụng 'sizeof', trông giống như một hàm do các dấu ngoặc đơn, nhưng nó không phải là một hàm. 'sizeof' là toán tử và các dấu ngoặc đơn chỉ là một quy ước. – 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

Ngôn ngữ không chính xác. –

1

tôi đã sử dụng mã sau đây như gợi ý ở trên để đánh giá số phần tử trong mảng 2 chiều của tôi:

#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]); 
    } 

} 

Nó hoạt động độc đáo. Theo như tôi biết bạn không thể kết hợp các kiểu dữ liệu khác nhau trong mảng C và bạn cũng nên có cùng kích thước của tất cả các phần tử mảng (nếu tôi đúng), do đó bạn có thể tận dụng điều đó với mẹo nhỏ này:

  1. đếm số byte có hàm sizeof() từ toàn bộ mảng 2d (trong trường hợp này là 3 * 20 = 60 byte)
  2. đếm số byte với hàm sizeof() từ các phần tử mảng đầu tiên [0] (trong trường hợp này 20 byte)
  3. chia toàn bộ kích thước với kích thước của một phần tử sẽ cung cấp cho bạn số phần tử

Snipped này nên được di động cho 2d mảng trong C tuy nhiên trong các ngôn ngữ lập trình khác nó không thể làm việc vì bạn có thể sử dụng các loại dữ liệu khác nhau trong mảng với kích cỡ khác nhau (như trong JAVA).

3

Không thể tìm số phần tử trong mảng trừ khi đó là mảng ký tự. Hãy xem xét ví dụ bên dưới:

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

Giá trị trên cho chúng tôi giá trị 100 ngay cả khi số phần tử là năm. Nếu nó là một mảng ký tự, bạn có thể tìm kiếm tuyến tính cho chuỗi rỗng ở cuối mảng và tăng bộ đếm khi bạn đi qua.

+0

Điều bạn muốn viết: 'printf ("% d ", size);'. Nhưng bạn là chính xác, bạn có thể tìm thấy kích thước chỉ được xác định của mảng, không kích thước thực tế! – 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; 
} 

OUTPUT = 6

GIẢI THÍCH

p là một con trỏ đến một mảng 1-D, và trong vòng lặp for(p=arr,p<&arr+1;p++) tôi đã p điểm đến địa chỉ cơ sở . Giả sử địa chỉ cơ sở của nó là 1000; nếu chúng ta tăng p thì nó trỏ đến 1002 và cứ tiếp tục như vậy. Bây giờ đến khái niệm &arr - Về cơ bản nó đại diện cho toàn bộ mảng, và nếu chúng ta thêm 1 vào toàn bộ mảng tức là &arr+1, nó cho địa chỉ 1012 tức là địa chỉ của mảng 1-D tiếp theo (trong trường hợp của chúng ta là kích thước của int là 2), do đó tình trạng này trở nên 1000 < 1012.

vì vậy, về cơ bản tình trạng này trở nên

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

và bây giờ chúng ta hãy kiểm tra điều kiện và đếm giá trị

  • thời gian 1 p=1000p<1012 điều kiện là true: nhập trong vòng lặp, tăng giá trị của count để 1.
  • lần thứ 2 p=1002p<1012 điều kiện là true: nhập trong vòng lặp, tăng giá trị của count để 2.
  • ...
  • lần thứ 6 p=1010p<1012 điều kiện là true: nhập trong vòng lặp, tăng giá trị của count đến 6.
  • thời gian qua p=1012p<1012 điều kiện là sai: in giá trị của count=6 trongTuyên bố.
+0

Điều này không hoạt động (ít nhất là trong C++). Bạn sẽ phải cast '& arr + 1' vào (int *) như thế:' for (p = arr; p <(int *) (& arr + 1); p ++) ' – Staszek

-1

Thực ra, không có cách thích hợp để đếm các phần tử trong mảng số nguyên động. Tuy nhiên, lệnh sizeof hoạt động bình thường trong Linux, nhưng nó không hoạt động đúng trong Windows. Từ quan điểm của một lập trình viên, không nên sử dụng sizeof để lấy số lượng các phần tử trong một mảng động. Chúng ta nên theo dõi số lượng các phần tử khi tạo mảng.

+0

Toán tử' sizeof' sẽ chỉ trả về * kích thước * của một mảng * được khai báo trong cùng phạm vi *, nếu không, 'sizeof' chỉ báo cáo kích thước của con trỏ * mà mảng được chuyển đổi khi được truyền dưới dạng tham số. Nó không có gì để làm với hệ điều hành và không có khuyến nghị chống lại bằng cách sử dụng 'sizeof' trên hoặc khác hơn là hiểu những gì bạn đang dùng' sizeof'. (*không có ý định chơi chữ*). –

-1

tôi chủ yếu là tìm thấy một cách dễ dàng để thực hiện theo chiều dài của mảng bên trong một vòng lặp chỉ như thế

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

Nếu chúng ta không biết số phần tử trong mảng và khi đầu vào được cho bởi người dùng vào thời gian chạy. Sau đó, chúng ta có thể viết mã như

C Mã sản phẩm:

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

C++ Mã sản phẩm:

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

Bây giờ đếm sẽ được có đếm số phần tử mảng được nhập vào.

Các vấn đề liên quan