将unsigned char转换为char *并在C中连接它们

时间:2017-07-05 18:32:18

标签: c

我希望将值char*转换为通过函数传递值的int my_function(unsigned char param1, unsigned char param2) { char* buffer_char; const char* mss_part_1 = "Value 1: "; const char* mss_part_2 = " Value 2: "; buffer_char = malloc(240); strcpy(buffer_char, mss_part_1); //OK strcat(buffer_char, param1); //ERROR strcat(buffer_char, mss_part_2); //OK strcat(buffer_char, param2); //ERROR //Desire Output: "Value 1: 1234 Value 2: 5678" printf("%s", buffer_char); free(buffer_char); } int main(int argc, char const *argv[]) { unsigned char value1[10]; unsigned char value2[10]; strncpy(value1, "1234", 4); strncpy(value2, "5678", 4); my_function(value1, value2); return 0; } 类型之一。

这是我的计划:

strcat()

问题在于strcat()函数,当我尝试将值连接为" unsigned char"但我还没有找到转换它的方法,所以我可以连接它。

我正在尝试使用{{1}}函数,但如果有更高效的表单我想知道。

注意:显示输出值没有问题。

3 个答案:

答案 0 :(得分:3)

您的问题出在功能声明中,并了解unsigned charunsigned char[]之间的区别。在您的函数定义中:

int my_function(unsigned char param1, unsigned char param2)

..您声明my_function接受两个参数,每个参数都为unsigned char类型。对于编译器,这意味着每个参数包含一个char ..它不是指针,但实际上是一个8位整数类型..每个参数应该包含一个8位字符。但你真正想要传递的是指向一组字符的指针:

int my_function(unsigned char *param1, unsigned char *param2)

int my_function(unsigned char param1[], unsigned char param2[])

对于编译器来说,这两者意味着相同的事情,因为数组的名称(无论数组中包含的类型)总是计算为指向数组中第一个元素的指针。

因此,当您定义变量时:

unsigned char value1[10];

..你正在分配(在堆栈中,在这种情况下..因为它是一个局部变量)一个由10个无符号字符组成的数组,一个接一个。但是当你传递或引用value1时,它会计算为数组中第一个字符的地址,换句话说,是一个指向数组的指针,它的类型为unsigned char *

你应该考虑的第二件事是,当你的文本看起来都是适合char数组类型的常规ASCII字符时,你为什么要使用unsigned char? unsigned char没有任何问题,编译器通常会为你做这些转换,但一般来说,当你混淆类型而不知道后果时,你可能会遇到问题。请注意您使用的功能类型,并尽量保持一致。

答案 1 :(得分:0)

首先,apply(Lambda...)不会自动添加终止NUL字符strncpy,因此您必须手动添加它。其次,你的函数参数是'\0',它是一个无符号字符,它们应该是unsigned charunsigned char*,它是指向无符号字符(字符串)的指针。

这将有效:

unsigned char[]

答案 2 :(得分:0)

你传入指针,所以函数的sig应该有指针。

int my_function(unsigned char *param1, unsigned char *param2);

未签名的东西很可能是一种不必要的复杂问题 - 您可能希望在整个程序中摆脱它。您还使用strncpy错误,未能进行错误检查(malloc可能失败),并且您的函数的API很弱,因为它不允许您进行任何类型的绑定检查。

除了边界检查部分之外,这是一个快速而又脏的修复:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int my_function(char *param1, char *param2)
{
    char* buffer_char;

    const char* mss_part_1 = "Value 1: ";
    const char* mss_part_2 = " Value 2: ";

    buffer_char = malloc(240);
    if(0 == buffer_char)
        return -1;

    strcpy(buffer_char, mss_part_1);
    strcat(buffer_char, param1);
    strcat(buffer_char, mss_part_2);
    strcat(buffer_char, param2);

    //Desire Output: "Value 1: 1234 Value 2: 5678"
    printf("%s", buffer_char);

    free(buffer_char);
    return 0;
}

int main(int argc, char const *argv[])
{
    char value1[10];
    char value2[10];

    strncpy(value1, "1234", 10);
    strncpy(value2, "5678", 10);

    my_function(value1, value2);

    return 0;
}

您的编译器可能会警告您所有这些错误。您应该将所有警告视为错误。