strncpy()
和memcpy()
是一样的吗?
由于strncpy()
仅接受char *作为参数,
Icasts整数数组为char *。
为什么它会得到不同的输出?
这是我的代码,
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define SIZE 5
void print_array(int *array, char *name ,int len) {
int i;
printf("%s ={ ",name);
for(i=0; i<len;i++)
printf("%d," ,array[i]);
printf("}\n");
}
int main(void){
char string1[SIZE] = {'1','2','3','4','\0'};
char string2[SIZE], string3[SIZE];
int array1[SIZE] = {1,2,3,4,5};
int array2[SIZE],array3[SIZE];
strncpy(string2,string1,sizeof(string1));
memcpy(string3, string1,sizeof(string1));
printf("string2 =%s \n",string2);
printf("string3 =%s \n",string3);
strncpy((char *)array2, (char*)array1 , sizeof(array1));
memcpy(array3,array1,sizeof(array1));
print_array(array2,"array2",SIZE);
print_array(array3,"array3",SIZE);
return 0;
}
事实证明
string2 =1234
string3 =1234
array2 ={ 1,0,0,0,0,}
array3 ={ 1,2,3,4,5,}
但为什么?它给出了不同的答案?
答案 0 :(得分:12)
strncpy((char *)array2, (char*)array1 , sizeof(array1));
将array1
投射到char *
并不能达到您想要的效果。该位置没有字符,只有整数(似乎是小端)。
发生的事情是strncpy
从整数数组复制字节,直到达到0字节,这很快就会发生。另一方面,memcpy
并不关心0字节而只是复制整个事物。
换句话说,strncpy
在第一个整数“内部”找到0字节并停止复制;但它确实用目标缓冲区填充了指定大小的零。
答案 1 :(得分:1)
您可以使用strncpy
实现memcpy
,但反过来则不起作用,因为strncpy
停在“字符串的结尾”,这不会对于不是C样式字符串的数据(例如,其中包含零字节),它可以很好地工作。
用strncpy
写memcpy
将是这样的:
char *strncpy(char *dest, const char *src, size_t maxlen)
{
size_t len = strlen(src);
memcpy(dest, src, min(len, maxlen));
if (len < maxlen) memset(dest+len, 0, maxlen-len);
return dest;
}
(注意:上述实现不适用于src
字符串未正确终止的情况 - 真正的strncpy
确实可以解决这个问题 - 它可以在上面的代码中修复,但它变得相当复杂)。