您是否必須手動循環訪問數組,然後獲取每個字符數組的strlen數,然後求和,用相加的值分配目標值,然後再次循環數組?如何迭代c中的字符數組數組?
如何找到包含字符數組的數組的大小,以便您可以遍歷它們?
您是否必須手動循環訪問數組,然後獲取每個字符數組的strlen數,然後求和,用相加的值分配目標值,然後再次循環數組?如何迭代c中的字符數組數組?
如何找到包含字符數組的數組的大小,以便您可以遍歷它們?
你如何找到包含字符數組,所以你可以在他們迭代數組的大小?
有兩種方式:
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'
。
我們走了。謝謝你回答一切。 – 2012-01-28 17:32:55
需要返回+1,因爲它是基於零的權利? – 2012-01-28 18:27:27
...或者只是使用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
我想你想連接字符串。如果是這樣,是的。在分配之前,您必須知道您需要多少空間。
實際上,您可以使用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
是無效的,當你知道的長度。 (我還是喜歡它,因爲它在一個時間分配的內存)一些更有效的代碼是:
這種'strcat'的使用非常昂貴:它使得算法在O(n2)時間內運行,而它可能是線性的。 – 2012-01-28 17:29:04
線性如何實現? @asaelr我的問題的一部分是如何弄清楚在這種情況下n是什麼。 – 2012-01-28 17:30:14
我假設你正試圖使一個字符串,它是所有的數組中的字符串的串聯。
有2種方式這樣做的:
做2遍你的建議,在第二遍在第一遍的長度相加,分配目標字符串,然後追加字符串
做1次。首先將緩衝區分配給一定的大小。附加字符串,記錄總大小。如果您沒有足夠空間存放字符串,請使用realloc()
重新分配緩衝區。最有效的重新分配方法是每次將緩衝區大小加倍。
#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;
}
我不喜歡元。 (我不明白界面)。我認爲那些編輯空白(以某種公司規範形式)的人是低生活形式。請走開。 **只是不接觸我的來源**你whitespae編輯。如果您無法閱讀源代碼,請返回到java。 – wildplasser 2016-12-23 23:11:47
[meta]請添加一個選項來接受/拒絕這些僞造的空白納粹編輯。 – wildplasser 2016-12-23 23:28:46
有些代碼可以幫助我們理解你在問什麼。 – user7116 2012-01-28 17:14:40
聽起來就像你想複製C字符串的數組。是對的嗎? – vitaut 2012-01-28 17:19:28
我想最終將數組中的字符串連接成單個字符串。需要知道要爲目標字符串分配多少內存空間。我不明白你怎麼知道要在for循環中作爲終止條件放置什麼,即數組的長度是多少。 – 2012-01-28 17:20:49