2012-03-01 40 views
21
char* names[]={"A", "B", "C"}; 

Có cách nào để tìm số chuỗi trong mảng không. Giống như, ví dụ trong trường hợp này, nó phải là 3. Xin vui lòng cho tôi biết. Cảm ơn.tìm số chuỗi trong một chuỗi các chuỗi trong C

+2

Đây là một trường hợp cụ thể như thế nào để có được kích thước của một mảng, mà đã có một câu trả lời chung ở đây: https://stackoverflow.com/questions/37538/how-do-i- xác định-kích thước-of-my-mảng-in-c Tức là một bản sao. – this

Trả lời

25

Trong trường hợp này bạn có thể chia tổng kích thước bằng kích thước của các yếu tố đầu tiên:

num = sizeof(names)/sizeof(names[0]); 

cẩn thận mặc dù, các công trình này với mảng. Nó sẽ không hoạt động với con trỏ.

+0

Nhiều cơ sở mã xác định macro này như sau: #define ARRAY_SIZE (x) (sizeof (x)/sizeof ((x) [0])) –

+0

Câu trả lời này phải là câu trả lời được chấp nhận. Đó là câu trả lời đầu tiên, và nó là chính xác. Điều đó nói rằng, _the bounty_ Tôi trao giải cho câu trả lời đầu tiên giải thích tại sao điều này hoạt động. – dotancohen

+0

Tôi đã thử sizeof với mảng mảng [] = {". A.", ".. B", ". C", ". D.", ".. E",} Tôi nhận được 3/5. .... với sizeof AND strlen – delive

2
int count = sizeof(names)/sizeof(*names); 

này có tổng kích thước của names và chia nó bởi kích thước của một phần tử trong names, kết quả là 3.

+0

"không hoạt động với bộ nhớ được cấp phát động". Cụ thể hơn, nó không hoạt động nếu mảng (tương phản với "các thành viên của mảng") đã được phân bổ động. Vì đây là một mảng các con trỏ, nên cần phân biệt. –

13

Nó phụ thuộc vào cách thức mảng của bạn được tạo ra. Trong C, không có cách nào để kiểm tra độ dài của một mảng là một con trỏ, trừ khi nó có một phần tử sentinel, hoặc một số nguyên được truyền với mảng như một số các phần tử trong mảng. Trong trường hợp của bạn, bạn có thể sử dụng này:

int namesLen = sizeof(names)/sizeof(char); 

Tuy nhiên, nếu mảng của bạn là một con trỏ,

char **names = { "A", "B", "C" }; 

Bạn có thể có một số nguyên đó là hằng số cho độ dài của mảng:

int namesLen = 3; 

Hoặc thêm một giá trị trọng điểm (ví dụ như NULL)

char **names = { "A", "B", "C", NULL }; 

int namesLen = -1; 
while (names[++namesLen] != NULL) { /* do nothing */} 

// namesLen is now the length of your array 

Như một cách khác, bạn có thể tạo ra một cấu trúc được làm đầy với các giá trị bạn muốn:

struct Array { 
    void **values; 
    int length; 
}; 

#define array(elements...) ({ void *values[] = { elements }; array_make(values, sizeof(values)/sizeof(void *)); }) 
#define destroy(arr) ({ free(arr.values); }) 

struct Array array_make(void **elements, int count) 
{ 
    struct Array ret; 
    ret.values = malloc(sizeof(void *) * count); 
    ret.length = count; 

    for (int i = 0; i < count; i++) { 
     ret.values[i] = elements[i]; 
    } 

    return ret; 
} 

Và bạn sẽ sử dụng nó như vậy:

struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test"); 
// use myArray 

printf("%i", myArray.length); 
destroy(myArray); 
0

Một cách đơn giản để trở lại số hoặc chuỗi trong một mảng là để lặp qua mảng cho đến khi bạn hết chuỗi. Đây là một ví dụ.

#include <stdio.h> 

int main() 
{ 
    char* names[] = {"John", "Paul", "George", "Ringo", '\0'}; 

    int size = 0; 
    while(names[++size]!='\0'); 

    printf("Size: %d\n", size); // Prints "4" 

    return 0; 
} 

Phương pháp này có ưu điểm là nó hoạt động ngay cả khi các dây có chiều dài khác nhau. Lưu ý byte NULL kết thúc trong mảng names và ký tự ; để đóng câu lệnh while vì không có phần tử câu lệnh nào để chạy.

+2

Điều này chỉ hoạt động tốt nếu có NULL là phần tử cuối cùng của mảng * names [] của bạn và nếu bạn so sánh với một NULL trong vòng lặp while? Nếu không, bạn đang ngân hàng trên bộ nhớ mà chuỗi của bạn được lưu trữ để được 'zeroed' mà không phải luôn luôn như vậy! Do đó, mã trên không an toàn hoặc đáng tin cậy. – mike

+2

Để thêm vào ở trên, sự hiểu biết của tôi là trong đoạn mã trên bạn đang lưu trữ một mảng con trỏ tới chuỗi. Mảng này hiện có 4 phần tử (tức là 4 con trỏ đến chuỗi của bạn). Mỗi chuỗi là null chấm dứt, nhưng mảng con trỏ của bạn không theo mặc định có một bản ghi chấm dứt - bạn cần phải tự thiết lập nó, và 'NULL' là một ứng cử viên tốt như là bản ghi cuối cùng. Bằng cách này bạn có thể dễ dàng nhận ra nó trong vòng lặp 'while' của bạn, bằng cách so sánh với' NULL'. Tôi hy vọng lời giải thích của tôi là rõ ràng và sự hiểu biết của tôi đúng. – mike

+0

@mike: Bạn là chính xác và tôi đã chỉnh sửa mã để tính đến sự quan sát của bạn. Cảm ơn bạn. – dotancohen

18

Đối với mảng, ví dụ về tiền thưởng, thực hiện sizeof(names)/sizeof(names[0]) là đủ để xác định độ dài của mảng.

Thực tế là các chuỗi trong các ví dụ có độ dài khác nhau không quan trọng. names là một mảng của char *, do đó, tổng kích thước của mảng tính theo byte là số phần tử trong mảng lần kích thước của mỗi phần tử (ví dụ: char *). Mỗi con trỏ có thể trỏ đến một chuỗi có độ dài bất kỳ hoặc NULL. Không quan trọng.

chương trình thử nghiệm:

#include<stdio.h> 

int main(void) 
{ 
    char* names1[]={"A", "B", "C"}; // Three elements 
    char* names2[]={"A", "", "C"}; // Three elements 
    char* names3[]={"", "A", "C", ""}; // Four elements 
    char* names4[]={"John", "Paul", "George", "Ringo"}; // Four elements 
    char* names5[]={"", "B", NULL, NULL, "E"}; // Five elements 

    printf("len 1 = %zu\n",sizeof(names1)/sizeof(names1[0])); 
    printf("len 2 = %zu\n",sizeof(names2)/sizeof(names2[0])); 
    printf("len 3 = %zu\n",sizeof(names3)/sizeof(names3[0])); 
    printf("len 4 = %zu\n",sizeof(names4)/sizeof(names4[0])); 
    printf("len 5 = %zu\n",sizeof(names5)/sizeof(names5[0])); 
} 

Output:

len 1 = 3 
len 2 = 3 
len 3 = 4 
len 4 = 4 
len 5 = 5 

EDIT:

Để làm rõ, điều này chỉ hoạt động nếu bạn đã xác định một mảng, tức là char *names[] hoặc char names[][], và bạn đang ở trong phạm vi nơi mảng được xác định. Nếu nó được định nghĩa là char **names thì bạn có một con trỏ có chức năng như một mảng và kỹ thuật trên sẽ không hoạt động. Tương tự, nếu char *names[] là tham số hàm, trong trường hợp đó, mảng phân rã thành địa chỉ của phần tử đầu tiên.

+0

Cảm ơn bạn. Lời giải thích mà bạn đưa ra là tuyệt vời, và đó là chìa khóa. Tôi giả sử dựa trên lời giải thích rằng câu trả lời của cnicutar phải là câu trả lời _accepted, vì nó đưa ra cùng một câu trả lời nhưng không giải thích, nhưng câu trả lời này cho đến nay là ứng cử viên hàng đầu cho tiền thưởng. Cảm ơn bạn. – dotancohen

+0

Các chuyên viên chăm sóc có thể giải thích? – dbush

0

Để tìm số ký tự trong một mảng chuỗi, bạn có thể lặp qua các phần tử mảng và tại mỗi vòng lặp chỉ mục thông qua nội dung của phần tử (hoặc chuỗi) cho đến khi bạn nhấn '\ 0'. Các mã sau đây không chỉ là và làm việc với bất kỳ kích thước của chuỗi được lưu trữ trong mảng

char* names[] = {"An", "Bed", "Cards"}; 

    int arrayIndex, counter; 
    for (arrayIndex = 0; arrayIndex < (sizeof(names)/sizeof(char*)); arrayIndex++) { 
     //counting also chars in each string (extra, not necessarily the question) 
     char* stringAtIndex = names[arrayIndex]; 
     char c; 
     int i = 0; 
     do { 
      c = *(stringAtIndex + i++); 
     } while (c != '\0'); 
     counter += (i-1); //exclude terminating char '\0' 
    } 
    printf("Number of array elements: %d", arrayIndex+1); //number of strings 
    printf("Total chars %d\n", counter); // Prints 10 which is number of chars excluding '\0' 
+0

Tôi không nghĩ rằng điều này trả lời câu hỏi? –

+0

Câu hỏi là "Có cách nào để tìm số chuỗi trong mảng" nhưng câu trả lời của tôi là cho số ký tự trong một mảng chuỗi. Tôi sẽ xóa nhưng sau đó nghĩ rằng ai đó có thể tìm thấy cái này hữu ích :) – Lukas

0

tìm số chuỗi trong một mảng các chuỗi trong C

Phương pháp đơn giản để tìm ra số đối tượng trong một mảng là lấy kích thước của mảng chia cho kích thước của một trong các phần tử của nó. Sử dụng toán tử sizeof để trả về kích thước của đối tượng theo byte.

// For size_t 
#include <stddef.h> 

char* names[] = { "A", "B", "C" }; 
size_t number_of_strings = sizeof names/sizeof names[0]; 

printf("Number of strings %zu\n", number_of_strings); 

quan trọng cần xem xét các kiểu trả về từ sizeofsize_t, một kiểu dữ liệu integer unsigned có khả năng lập chỉ mục bất kỳ mảng cũng như kích thước của bất kỳ đối tượng. Để in biến loại size_t, hãy sử dụng công cụ sửa đổi z.

4

Điều bạn định nghĩa ở đây không phải là một chuỗi các chuỗi, đó là một chuỗi các con trỏ đến các ký tự. nếu bạn muốn biết số lượng chuỗi, bạn chỉ cần đếm số lượng con trỏ, vì vậy, chẳng hạn như

sẽ thực hiện, theo cách này, bạn sẽ chia kích thước của mảng theo kích thước của một con trỏ. Nhưng lưu ý điều này chỉ hoạt động nếu kích thước của mảng được biết tại thời gian biên dịch (tức là mảng được phân bổ tĩnh), nếu nó được định nghĩa động (tức là chuỗi char **) thì sizeof(strings) sẽ trả về kích thước của con trỏ không phải mảng.

p.s.: độ dài của chuỗi không liên quan, vì mảng không còn "nhận biết" về những gì con trỏ trỏ tới.

1

Có cách nào để tìm số của chuỗi trong mảng

Tất nhiên có được, hãy thử này:

#include<stdio.h> 

int main(void){ 
    size_t size, i=0; 
    int count=0; 
    char* names[]={"A", "B", "C"}; 

    size = sizeof(names)/sizeof(char*); 

    for(i=0;i<size;i++){ 
     printf("%d - %s\n",count+1, *(names+i)); 
     count++; 
    } 

    printf("\n"); 
    printf("The number of strings found are %d\n",count); 
    return 0; 
} 
1 - A 
2 - B 
3 - C 
The number of strings found are 3 

Điều tương tự với:

#include<stdio.h> 

int main(void){ 
    size_t size, i=0; 
    int count=0; 
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"}; 

    size = sizeof(names)/sizeof(char*); 

    for(i=0;i<size;i++){ 
     printf("%d - %s\n",count+1, *(names+i)); 
     count++; 
    } 

    printf("\n"); 
    printf("The number of strings found are %d\n",count); 
    return 0; 
} 

Output:

1 - Jimmy 
2 - Tom 
3 - Michael 
4 - Maria 
5 - Sandra 
6 - Madonna 
The number of strings found are 6 

Hoặc sử dụng một chức năng như thế này:

#include<stdio.h> 

size_t arrLength(size_t len, char **arr){ 
    size_t i=0; 
    size_t count=0; 

    for(i=0;i<len;i++){ 
     printf("%zu - %s\n",count+1, *(arr+i)); 
     count++; 
    } 

    return count; 
} 

int main(void){ 
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"}; 
    size_t length,size; 

    size = sizeof(names)/sizeof(char*); 
    length = arrLength(size, names); 

    printf("\n"); 
    printf("The number of strings found are %zu\n",length); 
    return 0; 
} 

Output:

1 - Jimmy 
2 - Tom 
3 - Michael 
4 - Maria 
5 - Sandra 
6 - Madonna 
The number of strings found are 6 
Các vấn đề liên quan