strncpy()和memcpy()有什么不同?

C l*_*ner 3 c memcpy strncpy

strncpy()memcpy()是一样的吗?

由于strncpy()只接受char*作为参数,因此将整数数组Icast为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;
}
Run Code Online (Sandbox Code Playgroud)

事实证明

string2 =1234
string3 =1234
array2 ={ 1,0,0,0,0,}
array3 ={ 1,2,3,4,5,}
Run Code Online (Sandbox Code Playgroud)

但为什么?它给出了不同的答案?

cni*_*tar 12

strncpy((char *)array2, (char*)array1 , sizeof(array1));
Run Code Online (Sandbox Code Playgroud)

施放array1到一个char *没有做你想要的.该位置没有字符,只有整数(看似小端).

发生的事情是strncpy从整数数组中复制字节,直到达到0字节,这很快就会发生.另一方面memcpy,不关心0字节只是复制整个事情.

换句话说,strncpy在第一个整数"内部"找到0字节并停止复制; 但它会使用零填充目标缓冲区,直到达到指定的大小.