2012-01-28 67 views
5

您是否必須手動循環訪問數組,然後獲取每個字符數組的strlen數,然後求和,用相加的值分配目標值,然後再次循環數組?如何迭代c中的字符數組數組?

如何找到包含字符數組的數組的大小,以便您可以遍歷它們?

+1

有些代碼可以幫助我們理解你在問什麼。 – user7116 2012-01-28 17:14:40

+0

聽起來就像你想複製C字符串的數組。是對的嗎? – vitaut 2012-01-28 17:19:28

+0

我想最終將數組中的字符串連接成單個字符串。需要知道要爲目標字符串分配多少內存空間。我不明白你怎麼知道要在for循環中作爲終止條件放置什麼,即數組的長度是多少。 – 2012-01-28 17:20:49

回答

7

你如何找到包含字符數組,所以你可以在他們迭代數組的大小?

有兩種方式:

  1. 記錄,當你在一個變量分配它在數組中字符串的數量。
  2. 在數組的末尾分配一個額外的char*,並在其中存儲一個空指針作爲標記,類似於NUL字符用於終止字符串的方式。

換句話說,當分配數組時,你必須做自己的簿記工作,因爲C不會給你想要的信息。如果按照第二個建議,你可以得到字符總數字符串數組與

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; 
} 

不要忘了這樣做的實際串聯時預留空間爲'\0'

+0

我們走了。謝謝你回答一切。 – 2012-01-28 17:32:55

+1

需要返回+1,因爲它是基於零的權利? – 2012-01-28 18:27:27

+0

...或者只是使用sizeof(array)/ sizeof(entry)來獲得長度,如果你真的有一個數組(不是指針 - 它們不相同)。許多人(過去10年左右我也這樣認爲)數組和指針是相同的,但它們不是 - 數組只會在需要時自動退化爲指針。例如int a [10] = {0}; sizeof(a)/ sizeof(int)會給你10; int * a = malloc(10 * sizeof(int)); sizeof(a)== sizeof(int *)在這種情況下 – griffin 2013-08-14 11:15:02

0

我想你想連接字符串。如果是這樣,是的。在分配之前,您必須知道您需要多少空間。

實際上,您可以使用realloc,但實際上它只是每次都複製上一個字符串,效率更低。

一些代碼:(假設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]); 

編輯:正如一些評論,strcat是無效的,當你知道的長度。 (我還是喜歡它,因爲它在一個時間分配的內存)一些更有效的代碼是:

​​
+0

這種'strcat'的使用非常昂貴:它使得算法在O(n2)時間內運行,而它可能是線性的。 – 2012-01-28 17:29:04

+0

線性如何實現? @asaelr我的問題的一部分是如何弄清楚在這種情況下n是什麼。 – 2012-01-28 17:30:14

1

我假設你正試圖使一個字符串,它是所有的數組中的字符串的串聯。

有2種方式這樣做的:

  1. 做2遍你的建議,在第二遍在第一遍的長度相加,分配目標字符串,然後追加字符串

  2. 做1次。首先將緩衝區分配給一定的大小。附加字符串,記錄總大小。如果您沒有足夠空間存放字符串,請使用realloc()重新分配緩衝區。最有效的重新分配方法是每次將緩衝區大小加倍。

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

我不喜歡元。 (我不明白界面)。我認爲那些編輯空白(以某種公司規範形式)的人是低生活形式。請走開。 **只是不接觸我的來源**你whitespae編輯。如果您無法閱讀源代碼,請返回到java。 – wildplasser 2016-12-23 23:11:47

+0

[meta]請添加一個選項來接受/拒絕這些僞造的空白納粹編輯。 – wildplasser 2016-12-23 23:28:46