在 C 中,我有两个 char 数组:
char array1[18] = "abcdefg";
char array2[18];
如何复制 to 的array1
值array2
?我可以这样做:array2 = array1
?
您不能直接这样做array2 = array1
,因为在这种情况下,您操作的是数组 ( char *
) 的地址,而不是它们的内部值 ( char
)。
从概念上讲,您想要做的是遍历源 ( array1 ) 的所有字符并将它们复制到目标 ( array2 )。有几种方法可以做到这一点。例如,您可以编写一个简单的 for 循环,或使用memcpy
.
话虽如此,字符串的推荐方法是使用strncpy
. 它可以防止常见错误,例如导致缓冲区溢出array1
(如果从用户输入填充:键盘、网络等,这尤其危险)。像这样:
// Will copy 18 characters from array1 to array2
strncpy(array2, array1, 18);
作为@Prof。Falken 在评论中提到,strncpy
可能是邪恶的。确保您的目标缓冲区足够大以包含源缓冲区(包括\0
字符串末尾的 )。
如果您的数组不是字符串数组,请使用:
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';
最后一行实际上很重要,因为strncpy()
并不总是空终止字符串。(如果目标缓冲区太小而无法包含整个源字符串,sntrcpy() 将不会终止目标字符串。)
strncpy() 的联机帮助页甚至指出“警告:如果 src 的前 n 个字节中没有空字节,则放在 dest 中的字符串将不会以空值结尾。”
strncpy() 表现出这种有些奇怪的方式的原因是,它最初并不是作为一种复制字符串的安全方式而设计的。
另一种方法是使用 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);
}
从函数返回后,数组本身保持不变。
数组的这种“衰减到指针值”语义是赋值不起作用的原因。l 值是数组类型,而右值是衰减的指针类型,所以赋值是在不兼容的类型之间。
char array1[18] = "abcdefg";
char array2[18];
array2 = array1; /* fails because array1 becomes a pointer type,
but array2 is still an array type */
至于为什么要引入“decay to pointer value”语义,是为了实现与C前身的源代码兼容。具体可以阅读《C语言的发展》。
您不能分配数组,名称是无法更改的常量。
您可以复制内容,使用:
strcpy(array2, array1);
假设源是有效字符串并且目标足够大,如您的示例所示。
它应该是这样的:
void cstringcpy(char *src, char * dest)
{
while (*src) {
*(dest++) = *(src++);
}
*dest = '\0';
}
.....
char src[6] = "Hello";
char dest[6];
cstringcpy(src, dest);
我建议使用 memcpy() 来复制数据。此外,如果我们将缓冲区分配给另一个 as array2 = array1
,则两个数组都具有相同的内存,并且 arrary1 中的任何更改也会在 array2 中偏转。但是我们使用 memcpy,两个缓冲区都有不同的数组。我推荐 memcpy() 因为 strcpy 和相关函数不复制 NULL 字符。
array2 = array1;
在 c 中不支持。您必须使用strcpy()之类的函数来执行此操作。
仅在下面的c函数... c ++您必须执行char数组然后使用字符串副本然后使用字符串标记器函数... c ++使做任何事情变得更加困难
#include <iostream>
#include <fstream>
#include <cstring>
#define TRUE 1
#define FALSE 0
typedef int Bool;
using namespace std;
Bool PalTrueFalse(char str[]);
int main(void)
{
char string[1000], ch;
int i = 0;
cout<<"Enter a message: ";
while((ch = getchar()) != '\n') //grab users input string untill
{ //Enter is pressed
if (!isspace(ch) && !ispunct(ch)) //Cstring functions checking for
{ //spaces and punctuations of all kinds
string[i] = tolower(ch);
i++;
}
}
string[i] = '\0'; //hitting null deliminator once users input
cout<<"Your string: "<<string<<endl;
if(PalTrueFalse(string)) //the string[i] user input is passed after
//being cleaned into the null function.
cout<<"is a "<<"Palindrome\n"<<endl;
else
cout<<"Not a palindrome\n"<<endl;
return 0;
}
Bool PalTrueFalse(char str[])
{
int left = 0;
int right = strlen(str)-1;
while (left<right)
{
if(str[left] != str[right]) //comparing most outer values of string
return FALSE; //to inner values.
left++;
right--;
}
return TRUE;
}
对于整数类型
#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")
您不能分配数组来复制它们。如何将一个内容复制到另一个取决于多个因素:
对于char
数组,如果您知道源数组是空终止的,并且目标数组对于源数组中的字符串(包括空终止符)足够大,请使用strcpy()
:
#include <string.h>
char array1[18] = "abcdefg";
char array2[18];
...
strcpy(array2, array1);
如果您不知道目标数组是否足够大,但源是 C 字符串,并且您希望目标是正确的 C 字符串,请使用snprinf()
:
#include <stdio.h>
char array1[] = "a longer string that might not fit";
char array2[18];
...
snprintf(array2, sizeof array2, "%s", array1);
如果源数组不一定以 null 结尾,但您知道两个数组的大小相同,则可以使用memcpy
:
#include <string.h>
char array1[28] = "a non null terminated string";
char array2[28];
...
memcpy(array2, array1, sizeof array2);
嗯,从技术上讲,你可以……</p>
typedef struct { char xx[18]; } arr_wrap;
char array1[18] = "abcdefg";
char array2[18];
*((arr_wrap *) array2) = *((arr_wrap *) array1);
printf("%s\n", array2); /* "abcdefg" */
但它看起来不会很漂亮。
…除非你使用 C 预处理器…</p>
#define CC_MEMCPY(DESTARR, SRCARR, ARRSIZE) \
{ struct _tmparrwrap_ { char xx[ARRSIZE]; }; *((struct _tmparrwrap_ *) DESTARR) = *((struct _tmparrwrap_ *) SRCARR); }
然后你可以这样做:
char array1[18] = "abcdefg";
char array2[18];
CC_MEMCPY(array2, array1, sizeof(array1));
printf("%s\n", array2); /* "abcdefg" */
它适用于任何数据类型,而不仅仅是char
:
int numbers1[3] = { 1, 2, 3 };
int numbers2[3];
CC_MEMCPY(numbers2, numbers1, sizeof(numbers1));
printf("%d - %d - %d\n", numbers2[0], numbers2[1], numbers2[2]); /* "abcdefg" */
(是的,上面的代码被授予始终工作并且它是可移植的)
以上都不适合我..这
name
在这里完美地工作char *name
是通过函数传递的
char *name
使用时间strlen(name)
char
的数组name
内容以temp
使用strcpy(temp, name);
如果您想返回原始内容,请随意使用。strcpy(name, temp);
将 temp 复制回name
,瞧,效果很好
const int size = strlen(name);
char temp[size];
cout << size << endl;
strcpy(temp, name);