3

strncpy()memcpy()同じですか?

strncpy()は char * のみをパラメーターとして受け入れるため、整数配列を 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,}

しかし、なぜ?それは別の答えを与えますか?

4

2 に答える 2

12
strncpy((char *)array2, (char*)array1 , sizeof(array1));

へのキャストarray1は、char *あなたが望むことをしません。その場所には文字はなく、整数のみがあります(リトルエンディアンのようです)。

何が起こっているかというと、整数配列からバイトが 0 byte に達するまでstrncpyコピーされますが、これはすぐです。一方、0バイトは気にせず、全体をコピーするだけです。memcpy

別の言い方をすればstrncpy、最初の整数の「内側」にある 0 バイトを見つけて、コピーを停止します。ただし、宛先バッファは指定されたサイズまでゼロで埋められます。

于 2013-09-03T17:01:22.793 に答える
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はこれに対処します - 上記のコードで修正できますが、かなり複雑になります)。

于 2013-09-03T17:18:18.870 に答える