将 const char* 复制到 char 数组中(面临错误)

标签 c

我有以下方法

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/

相关文章:

比较一个#define常量和一个相同值的变量不相等(C语言)

进入库时更改结构值

c - 在 for 循环中使用 printf( )

c - 为什么我没有正确使用 '->'?我知道这可能是一个简单的概念错误,但不知道为什么

C语言和迷你板

c - 如何在 C 中创建字符串数组?

c - ( __ ) "double underscore"在 c 程序中的含义是什么,即 : __asm__ , 我们或编译器如何使用它们

C 代码在 Visual Studio 2013 中有效,但在 2017 中无效?

c - 使用函数 malloc() 和 free(),初始化指针的问题

c - C 中的结构声明