94

C では、2 つの char 配列があります。

char array1[18] = "abcdefg";
char array2[18];

array1toの値をコピーする方法はarray2? 私はこれを行うことができます:array2 = array1

4

13 に答える 13

41

配列が文字列配列でない場合は、次を使用します。 memcpy(array2, array1, sizeof(array2));

于 2014-04-24T09:03:05.863 に答える
26

あらゆる種類の問題を引き起こす可能性がある、終了していない文字列から保護したい場合は、次のように文字列をコピーします。

char array1[18] = {"abcdefg"};
char array2[18];

size_t destination_size = sizeof (array2);

strncpy(array2, array1, destination_size);
array2[destination_size - 1] = '\0';

は常に文字列をnull で終了strncpy()するとは限らないため、最後の行は実際には重要です。(宛先バッファが小さすぎてソース文字列全体を格納できない場合、sntrcpy() は宛先文字列を null で終了しません。)

strncpy() のマンページには、「警告: src の最初の n バイトに null バイトがない場合、dest に配置された文字列は null で終了しない」とさえ記載されています。

strncpy() がこのやや奇妙な動作をする理由は、文字列をコピーするための安全な方法として本来意図されていなかったためです。

もう 1 つの方法は、snprintf() を strcpy() の安全な代替として使用することです。

snprintf(array2, destination_size, "%s", array1);

(ヒントをくれたjxhに感謝します。)

于 2013-05-20T08:49:59.657 に答える
8

strcpy()他の人が指摘したように、文字列はまたはそのバリアントでコピーされます。場合によっては、snprintf()同様に使用することもできます。

構造体の割り当ての一部として、配列を好きな方法でのみ割り当てることができます。

typedef struct { char a[18]; } array;
array array1 = { "abcdefg" };
array array2;

array2 = array1;

配列が関数に渡された場合、それらを割り当てることが許可されているように見えますが、これはセマンティクスの単なる偶然です。C では、配列は配列の最初のメンバーのアドレスの値を持つポインター型に崩壊し、このポインターが渡されます。したがって、関数の配列パラメーターは実際には単なるポインターです。割り当ては単なるポインター割り当てです。

void foo (char x[10], char y[10]) {
    x = y;    /* pointer assignment! */
    puts(x);
}

関数から戻った後、配列自体は変更されません。

配列のこの「ポインター値への減衰」セマンティックが、割り当てが機能しない理由です。左辺値は配列型ですが、右辺値は減衰ポインター型であるため、代入は互換性のない型間で行われます。

char array1[18] = "abcdefg";
char array2[18];
array2 = array1; /* fails because array1 becomes a pointer type,
                    but array2 is still an array type */

「ポインター値への減衰」セマンティックが導入された理由については、これは C の前身とのソース コードの互換性を実現するためでした。詳細については、C 言語の開発を参照してください。

于 2013-05-20T08:50:47.977 に答える
7

配列を割り当てることはできません。名前は変更できない定数です。

次のように、内容をコピーできます。

strcpy(array2, array1);

あなたの例のように、ソースが有効な文字列であり、宛先が十分に大きいと仮定します。

于 2013-05-20T08:39:49.420 に答える
2

データのコピーには memcpy() を使用することをお勧めします。また、バッファーを別のバッファーに割り当てるとarray2 = array1、両方の配列に同じメモリがあり、arrary1 の変更は array2 にも反映されます。ただし、me​​mcpy を使用すると、両方のバッファの配列が異なります。strcpy と関連する関数は NULL 文字をコピーしないため、memcpy() をお勧めします。

于 2013-05-20T09:17:24.817 に答える
0

整数型の場合

#include <string.h>    

int array1[10] = {0,1,2,3,4,5,6,7,8,9};
int array2[10];


memcpy(array2,array1,sizeof(array1)); // memcpy("destination","source","size")
于 2016-12-12T19:56:16.600 に答える
0

上記のどれも私のために働いていませんでした..これは完全に 機能しnameますここではchar *name、関数を介して渡されます

  1. char *name使用の長さを取得するstrlen(name)
  2. const変数に格納することが重要です
  3. 同じ長さのchar配列を作成する
  4. copynameのコンテンツをtempusingにコピーするstrcpy(temp, name);

元のコンテンツを取り戻したい場合は、好きなように使用してください。strcpy(name, temp);一時をコピーして戻すとname、出来上がりは完全に機能します

    const int size = strlen(name);
    char temp[size];
    cout << size << endl;
    strcpy(temp, name);
于 2020-09-01T10:23:32.747 に答える