C では、2 つの char 配列があります。
char array1[18] = "abcdefg";
char array2[18];
array1
toの値をコピーする方法はarray2
? 私はこれを行うことができます:array2 = array1
?
配列が文字列配列でない場合は、次を使用します。
memcpy(array2, array1, sizeof(array2));
あらゆる種類の問題を引き起こす可能性がある、終了していない文字列から保護したい場合は、次のように文字列をコピーします。
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に感謝します。)
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 言語の開発を参照してください。
配列を割り当てることはできません。名前は変更できない定数です。
次のように、内容をコピーできます。
strcpy(array2, array1);
あなたの例のように、ソースが有効な文字列であり、宛先が十分に大きいと仮定します。
データのコピーには memcpy() を使用することをお勧めします。また、バッファーを別のバッファーに割り当てるとarray2 = array1
、両方の配列に同じメモリがあり、arrary1 の変更は array2 にも反映されます。ただし、memcpy を使用すると、両方のバッファの配列が異なります。strcpy と関連する関数は NULL 文字をコピーしないため、memcpy() をお勧めします。
整数型の場合
#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")
上記のどれも私のために働いていませんでした..これは完全に
機能しname
ますここではchar *name
、関数を介して渡されます
char *name
使用の長さを取得するstrlen(name)
char
配列を作成するname
のコンテンツをtemp
usingにコピーするstrcpy(temp, name);
元のコンテンツを取り戻したい場合は、好きなように使用してください。strcpy(name, temp);
一時をコピーして戻すとname
、出来上がりは完全に機能します
const int size = strlen(name);
char temp[size];
cout << size << endl;
strcpy(temp, name);