我有以下方法
static void setName(const char* str, char buf[16])
{
int sz = MIN(strlen(str), 16);
for (int i = 0; i < sz; i++) buf[i] = str[i];
buf[sz] = 0;
}
int main()
{
const char* string1 = "I am getting bug for this long string greater than 16 lenght);
char mbuf[16];
setName(string,mybuf)
// if I use buf in my code it is leading to spurious characters since length is greater than 16 .
如果方法 static void setName(const char* str, char buf[16]) 中 buf 长度的限制为 16,请告诉我上面编码的正确方法是什么
最佳答案
当传递数组作为参数时,数组衰减为数组第一个元素的指针。必须定义一个规则,让方法知道元素的数量。
你声明char mbuf[16]
,你将它传递给setName()
,setName()
不会得到char []
,但会得到 char*
。
因此,声明应该是
static void setName(const char* str, char* buf)
接下来,char mbuf[16]
只能存储15个字符,因为最后一个字符必须是“空终止符”,即“\0”。否则会出现以下情况:
// if I use buf in my code it is leading to spurious characters since length is greater than 16 .
也许这会帮助你理解:
char str[] = "foobar"; // = {'f','o','o','b','a','r','\0'};
所以代码应该是
static void setName(const char* str, char* buf)
{
int sz = MIN(strlen(str), 15); // not 16
for (int i = 0; i < sz; i++) buf[i] = str[i];
buf[sz] = '\0'; // assert that you're assigning 'null terminator'
}
另外,我建议您不要重新发明轮子,为什么不使用 strncpy
来代替呢?
char mbuf[16];
strncpy(mbuf, "12345678901234567890", 15);
关于将 const char* 复制到 char 数组中(面临错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36807114/