[英]Unsigned char array concatenation in C
在C中連接無符號char數組的最佳方法是什么? 此外,有沒有辦法將無符號char數組與char數組連接在一起? 這些無符號字符數組中的2個實際上只是字符串,但為簡單起見,我將它們視為無符號字符數組。
要求很復雜:有一個函數將采用1(一個)無符號char數組。 一個無符號字符數組實際上是由4個變量串聯而成的,從而組成了1個無符號字符數組。 更復雜的是,第一個無符號char數組實際上只是一個可變長度的字符串,但是其最大長度為60(即有時長度= 15,其他時候= 60)。
someFunctionAssignsFirst(unsigned char *first)
{
//it could be 15 or 60 chars long.
...
}
unsigned char first[60] = //someFunctionAssignsFirst() //This is a string i.e. "variable size string max size 60"
unsigned char second[8] = "always8."; //This is a string i.e. "01234567"
unsigned char third[32] = "always32"; //This is a cryptographic key
unsigned char fourth[32] = "always32"; //This is a cryptographic key
我將如何獲得:
unsigned char allstrings[sizeof(first)+sizeof(second)+sizeof(third)+sizeof(fourth)] = //all strings combined
?
我嘗試了一些for循環,但是可變長度first
破壞了連接,我確信必須有更好的方法。
完全披露:我不是專家,我不一定愛C。此外,出於要求,不允許使用C ++或任何其他語言。
這就是我正在嘗試做的事情,並且(為澄清起見)我在結尾處沒有得到null字符,因此它不是真正的字符串。
unsigned char *first = "this is a sample string, human readable";
unsigned char *second = "12345678" //always a number
//unsigned char third -> I have the value from before and it's a key
//unsigned char fourth -> I have the value from before and it's a key
unsigned char allstrings[sizeof(first) + sizeof(second) + sizeof(third) + sizeof(fourth)];
int counter = 0;
for (int i = 0; i <= sizeof(first); i++)
{
allstrings[counter] = first[i];
counter++;
}
for (int i = 0; i <= sizeof(second); i++)
{
allstrings[counter] = second[i];
counter++;
}
for (int i = 0; i <= sizeof(third); i++)
{
allstrings[counter] = third[i];
counter++;
}
for (int i = 0; i <= sizeof(fourth); i++)
{
allstrings[counter] = fourth[i];
counter++;
}
在allstrings
, allstrings
變量沒有“可讀”之外的任何內容。
您需要使用strcpy
復制第一部分(即字符串),然后使用memcpy
復制其他三部分(不是字符串,而是char
數組)。
請注意,結果不是字符串而是char
數組,即它不是以null終止的。
unsigned char allstrings[strlen(first)+sizeof(second)+sizeof(third)+sizeof(fourth)];
strcpy(allstrings,first);
memcpy(allstrings+strlen(first),second,sizeof(second));
memcpy(allstrings+strlen(first)+sizeof(second),third,sizeof(third));
memcpy(allstrings+strlen(first)+sizeof(second)+sizeof(third),fourth,sizeof(fourth));
我猜您想將數組視為buffer 。 因此,有聲明是可以的,但是您現在無需定義內容:
unsigned char first[60];
unsigned char second[8];
unsigned char third[32];
unsigned char fourth[32];
#define ALLSTRLEN sizeof(first) + sizeof(second) + sizeof(third) + sizeof(fourth)
unsigned char allstrings[ALLSTRLEN];
該代碼將保持固定大小的數組。 並且請注意,出於安全考慮,陣列應為全局或靜態。
然后,您可以將內容復制到數組。 我只是將您的代碼放在main()
以連接這些數組:
int main()
{
strcpy((char *)first, "this is a sample string, human readable");
// do something for second, third, fourth....
//
int counter = 0;
// first array is a normal string, we have to copy null character for it
for (int i = 0; i <= strlen((char *)first)+1; i++)
{
allstrings[counter] = first[i];
counter++;
}
for (int i = 0; i <= sizeof(second); i++)
{
allstrings[counter] = second[i];
counter++;
}
for (int i = 0; i <= sizeof(third); i++)
{
allstrings[counter] = third[i];
counter++;
}
for (int i = 0; i <= sizeof(fourth); i++)
{
allstrings[counter] = fourth[i];
counter++;
}
// allstrings is finished
}
請注意,該示例僅適用於main()
函數; 如果調用一個函數來連接四個數組,則編譯器必須將數組作為指針傳遞,並且sizeof()
將是錯誤的(等於指針的大小)。 您可以通過以下方法測試尺寸:
printf("sizeof(second)=%d\n", sizeof(second));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.