簡體   English   中英

C中的無符號字符數組串聯

[英]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++;
    }

allstringsallstrings變量沒有“可讀”之外的任何內容。

您需要使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM