2012-01-28 44 views
5

Bạn có phải tự lặp qua mảng một lần và nhận được số lượng strlen của mỗi mảng ký tự, tổng hợp nó, phân bổ đích với giá trị tổng hợp và sau đó lặp lại mảng đó lần nữa không?Làm thế nào để bạn lặp qua một mảng các mảng ký tự trong c?

Làm thế nào để bạn tìm thấy kích thước của mảng có chứa các mảng ký tự để bạn có thể lặp qua chúng?

+1

Một số mã sẽ giúp chúng tôi hiểu bạn đang hỏi điều gì. – user7116

+0

Có vẻ như bạn muốn sao chép mảng chuỗi C. Có đúng không? – vitaut

+0

Tôi muốn cuối cùng nối các chuỗi trong mảng vào một chuỗi đơn. Cần phải biết bao nhiêu không gian bộ nhớ để phân bổ cho chuỗi đích. Tôi không hiểu làm thế nào bạn biết những gì để đặt là điều kiện chấm dứt trong vòng lặp for, tức là chiều dài của mảng là bao nhiêu. –

Trả lời

7

Làm thế nào để bạn tìm thấy kích thước của mảng chứa các mảng của các nhân vật để bạn có thể lặp qua chúng?

Có hai cách:

  1. Ghi số chuỗi trong mảng khi bạn phân bổ nó trong một biến.
  2. Phân bổ thêm char* ở cuối mảng và lưu trữ con trỏ rỗng trong đó dưới dạng dấu gửi, tương tự như cách ký tự NUL được sử dụng để chấm dứt chuỗi.

Nói cách khác, bạn phải tự lưu sổ kế toán khi phân bổ mảng vì C sẽ không cung cấp cho bạn thông tin mong muốn. Nếu bạn làm theo các gợi ý thứ hai, bạn có thể nhận được tổng số ký tự trong mảng các chuỗi với

size_t sum_of_lengths(char const **a) 
{ 
    size_t i, total; 
    for (i = total = 0; a[i] != NULL; i++) 
     total += strlen(a[i]); 
    return total; 
} 

Đừng quên để dành không gian cho một '\0' khi thực hiện nối thực tế.

+0

Hiện chúng tôi đi. Cảm ơn câu trả lời tất cả mọi thứ. –

+1

Cần phải trả về +1 vì nó không phải là 0? –

+0

... hoặc chỉ sử dụng sizeof (mảng)/sizeof (mục nhập) để có được độ dài nếu bạn thực sự có một mảng (không phải là một con trỏ - chúng KHÔNG giống nhau). Nhiều người (tôi cũng trong 10 năm qua) nghĩ rằng mảng và con trỏ là như nhau, nhưng chúng không phải là - mảng sẽ chỉ tự động thoái hóa thành một con trỏ nếu cần thiết. ví dụ. int a [10] = {0}; sizeof (a)/sizeof (int) sẽ cho u 10; int * a = malloc (10 * sizeof (int)); sizeof (a) == sizeof (int *) trong trường hợp này – griffin

0

Tôi đoán rằng bạn muốn ghép các chuỗi. Nếu có, vâng. Bạn phải biết bao nhiêu không gian bạn muốn trước khi bạn phân bổ nó.

Thực tế, bạn có thể sử dụng realloc, nhưng nó thực sự chỉ sao chép chuỗi trước đó mọi lúc và ít hiệu quả hơn nhiều.

Một số mã: (giả sử char *s[]int n)

int i,l=1; 
for (i=0;i<n;i++) l+=strlen(s[i]); 
char *r=malloc(l); 
r[0]=0; 
for (i=0;i<n;i++) strcat(r,s[i]); 

Edit: Theo một số ý kiến, strcat là không hiệu quả khi bạn biết độ dài. (. Tôi vẫn thích nó vì nó phân bổ bộ nhớ trong một thời gian) Một số mã có hiệu quả hơn là:

int i,l=1; 
for (i=0;i<n;i++) l+=strlen(s[i]); 
char *r=malloc(l); 
char *d=r; 
for (i=0;i<n;i++) { 
srtcpy(d,s[i]); 
d+=strlen(s[i]); 
} 
+0

Việc sử dụng 'strcat' này cực kỳ tốn kém: nó làm cho thuật toán chạy trong thời gian O (n²) trong khi nó có thể là tuyến tính. –

+0

Làm thế nào tuyến tính có thể được thực hiện? @asaelr một phần của câu hỏi của tôi là làm thế nào để tìm ra những gì n là trong trường hợp này. –

1

tôi giả sử bạn đang cố gắng để tạo ra một chuỗi đó là nối của tất cả các chuỗi trong mảng.

Có 2 cách để làm điều này:

  1. Make 2 đèo như bạn đề nghị, tổng hợp các độ dài ở đèo đầu tiên, bố trí chuỗi đích, và sau đó gắn thêm các chuỗi trong các đường chuyền thứ hai

  2. Thực hiện 1 lần. Bắt đầu bằng cách cấp phát bộ đệm cho một số kích thước. Nối các chuỗi, theo dõi tổng kích thước. Nếu bạn không có đủ chỗ cho một chuỗi, hãy phân bổ lại bộ đệm với realloc(). Phương pháp tái phân bổ hiệu quả nhất sẽ tăng gấp đôi kích thước của bộ đệm mỗi lần.

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

char *nstrdup(char **args); 
int main (int argc, char **argv) 
{ 
char * this; 

this = nstrdup(argv+1); 
printf("[%s]\n", this); 

return 0; 
} 

char *nstrdup(char **args) 
{ 
size_t len, pos; 
char **pp, *result; 

len = 0; 
for (pp = args; *pp; pp++) { 
     len += strlen (*pp); 
     } 
result = malloc (1+len); 

pos = 0; 
for (pp = args; *pp; pp++) { 
     len = strlen (*pp); 
     memcpy(result+pos, *pp, len); 
     pos += len; 
     } 
result[pos] = 0; 
return result; 
} 
+0

Tôi không thích meta. (Tôi không hiểu giao diện). Tôi nghĩ rằng những người chỉnh sửa khoảng trống (thành một dạng dạng kinh điển nào đó) là dạng sống thấp hơn. Làm ơn đi đi. ** JUST DONT TOUCH MY SOURCE ** bạn biên tập viên. Vui lòng quay lại java nếu bạn không thể đọc được nguồn. – wildplasser

+0

[meta] vui lòng thêm tùy chọn để chấp nhận/REJECT các chỉnh sửa không gian trắng-nazi không có thật này. – wildplasser

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