我希望将值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}}函数,但如果有更高效的表单我想知道。
注意:显示输出值没有问题。
答案 0 :(得分:3)
您的问题出在功能声明中,并了解unsigned char
和unsigned 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 char
或unsigned 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;
}
您的编译器可能会警告您所有这些错误。您应该将所有警告视为错误。