【问题标题】:Unsigned char array concatenation in CC中的无符号字符数组连接
【发布时间】:2016-02-18 03:30:36
【问题描述】:

在 C 中连接 unsigned char 数组的最佳方法是什么?此外,有没有办法将 unsigned char 数组与 char 数组连接起来?其中 2 个 unsigned char 数组实际上只是字符串,但为简单起见,我将它们视为 unsigned char 数组。

要求很复杂:有一个函数需要 1(一)个无符号字符数组。那一个 unsigned char 数组实际上是 4 个变量连接起来组成了 1 个 unsigned char 数组。为了增加复杂性,第一个 unsigned 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++ 或任何其他语言。


这是我试图做的,并且(为了澄清)我最后没有得到一个空字符,所以它不是一个真正的字符串。

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 变量在我上面的示例中除了“可读”之外没有任何内容。

【问题讨论】:

  • 明确地说,字符数组具有固定长度。它可能包含也可能不包含空字符'\0'string 是字符数组的一部分,最多包含一个空字符。所以并不是所有的字符数组都是字符串。
  • 这种“可变长度首先破坏了连接”以什么方式发生?请发布您尝试过的内容。
  • 函数真的不会“取 1(一)个无符号字符数组”。相反,它们通常取数组第一个元素的地址,大小也单独传入。
  • 你能澄清一下你不是故意终止第二,第三,第四吗?第一个 null 终止了吗? (如果不是,你怎么知道它的长度)
  • unsigned char second[8] = "always8."; //This is a string i.e. "01234567" 是矛盾的。 second[] 不包含空字符,因此不能是字符串。

标签: c arrays string


【解决方案1】:

您需要使用strcpy 复制第一部分,这是一个字符串,然后使用memcpy 复制其他3,这不是字符串,而是char 数组。

请注意,结果不是字符串,而是char 数组,即它不是以空值结尾的。

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

【讨论】:

  • 这可能在某些情况下有效。我的问题是另一边的函数需要first的长度= 60。在这种情况下,即使first被声明为unsigned char first[60],当它被函数分配时,它的值也只有15字符,strcpy 只写入 15 个字符,在 16 日,以second 开头。因此,它将混合接受我的allstrings 变量的函数中的值
  • @dcaping:C 中的数组不“知道”其中存储了多少元素。您必须自己在一个单独的变量中跟踪这一点,并将该值传递给任何需要知道它的函数。
  • 将无符号字符数组传递给期望字符指针的函数是违反约束的,请参见此处:stackoverflow.com/a/30538279/3963067
  • 这项工作略有不同。我无法得到任何超出可读性的内容,并且出现错误。我不得不更改 char 数组 [] 的顺序以将变量 char 数组放在最后。这是我让它工作的唯一方法。谢谢@dbush
【解决方案2】:

我猜你想把数组当作缓冲区。 所以有声明很好, 但此时不需要定义内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2014-01-21
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2017-11-27
    相关资源
    最近更新 更多