Malloc和strncpy

Malloc和strncpy,c,malloc,strncpy,C,Malloc,Strncpy,我想把一根绳子一分为二传给两个孩子。第一部分应为12个“0”字符,第二部分应为13个“1”字符。当我执行这段代码时,我没有得到这两样东西。具体来说,这就是输出。 左父:00000000000 父项权限:0000000000001 我不知道为什么,有人能帮忙吗 int bit_count(char *passed, int len){ int left = len/2; int right =(len/2)+(len % 2); char *lstring = malloc(sizeof(char

我想把一根绳子一分为二传给两个孩子。第一部分应为12个“0”字符,第二部分应为13个“1”字符。当我执行这段代码时,我没有得到这两样东西。具体来说,这就是输出。 左父:00000000000 父项权限:0000000000001 我不知道为什么,有人能帮忙吗

int bit_count(char *passed, int len){
int left = len/2;
int right =(len/2)+(len % 2);
char *lstring = malloc(sizeof(char)*(left+1));
char *rstring = malloc(sizeof(char)*(right+1));
strncpy(lstring, passed, sizeof(char)*12);
strncpy(rstring, passed+left, sizeof(char)*13);
printf("Parent Left: %s\n", lstring);
printf("Parent Right: %s\n", rstring);

问题是
strncpy()
如果由于限制而停止,而不是到达源字符串的末尾,则不会添加空终止符。因此,您需要添加空终止符

int bit_count(char *passed, int len) {
    int left = len/2;
    int right = len - left;
    char *lstring = malloc(left+1);
    char *rstring = malloc(right+1);
    strncpy(lstring, passed, left);
    lstring[left] = '\0';
    strncpy(rstring, passed+left, right);
    rstring[right] = '\0';
    printf("Parent Left: %s\nParent Right: %s\n", lstring, rstring);
}

问题是
strncpy()
如果由于限制而停止,而不是到达源字符串的末尾,则不会添加空终止符。因此,您需要添加空终止符

int bit_count(char *passed, int len) {
    int left = len/2;
    int right = len - left;
    char *lstring = malloc(left+1);
    char *rstring = malloc(right+1);
    strncpy(lstring, passed, left);
    lstring[left] = '\0';
    strncpy(rstring, passed+left, right);
    rstring[right] = '\0';
    printf("Parent Left: %s\nParent Right: %s\n", lstring, rstring);
}

在每个strncpy之后添加空字符

lstring[left]='\0';


rstring[right]='\0';

在每个strncpy之后添加空字符

lstring[left]='\0';


rstring[right]='\0';

如果你不需要它,也不知道它的确切用途,就不要使用strncpy

在您的情况下,这是完全多余的,您知道要复制的数组的大小。因此,请使用
memcpy

memcpy(lstring, passed, left);
lstring[left] = '\0';
memcpy(rstring, passed+left, right);
rstring[right] = '\0';

如果你不需要它,也不知道它的确切用途,就不要使用strncpy

在您的情况下,这是完全多余的,您知道要复制的数组的大小。因此,请使用
memcpy

memcpy(lstring, passed, left);
lstring[left] = '\0';
memcpy(rstring, passed+left, right);
rstring[right] = '\0';

如果你只想在这里硬编码12和13,为什么要计算左和右呢。这毫无意义。对,我把它改成那个,只是想了解发生了什么。最后,我将使用左和右。您不需要乘以
sizeof(char)
——strncpy的参数是要复制的字符数,而不是大小。@Barmar,您的评论的第二部分有点误导。字符的数量和C中的“大小”是一样的。@JensGustedt我试图将其与使用
malloc()
的方式区分开来,即将事物的数量乘以每个事物的大小来得到size参数。
strncpy
的参数不是一系列的东西,而是要复制的字符数。如果在这里硬编码12和13,为什么要计算左右。这毫无意义。对,我把它改成那个,只是想了解发生了什么。最后,我将使用左和右。您不需要乘以
sizeof(char)
——strncpy的参数是要复制的字符数,而不是大小。@Barmar,您的评论的第二部分有点误导。字符的数量和C中的“大小”是一样的。@JensGustedt我试图将其与使用
malloc()
的方式区分开来,即将事物的数量乘以每个事物的大小来得到size参数。
strncpy
的参数不是很多,而是要复制的字符数。“如果你不需要它,如果你不知道它到底做什么,就不要使用
strncpy
。”任何函数都可以这样说。但是,是的,
strncpy
特别容易引起误解。谢谢。这奏效了,你是对的,我不明白怎么回事。也许有一天。这是一个很好的解释。“如果你不需要它,如果你不知道它的确切用途,就不要使用strncpy。”任何函数都可以这样说。但是,是的,
strncpy
特别容易引起误解。谢谢。这奏效了,你是对的,我不明白怎么回事。也许有一天。这是一个很好的解释。