如何复制在C中的字符数组?
在C中,我有两个char数组:
char array1[18] = "abcdefg"; char array2[18];
如何将array1
的值复制到array2
? 我可以这样做: array2 = array1
?
你不能直接做array1 = array2
。 因为在这种情况下,你会操纵数组的地址( char *
),而不是它们的值。
对于这种情况,build议使用strncpy
来避免缓冲区溢出 ,特别是在用户input(键盘,networking等)填充了array1
情况下。 像这样:
// Will copy 18 characters from array1 to array2 strncpy(array2, array1, 18);
作为@Prof。 Falken在评论中提到, strncpy
可能是邪恶的 。 确保您的目标缓冲区足够大以包含源缓冲区(包括string末尾的\0
)。
如果你想防止可能导致各种问题的非终止string,请像这样复制你的string:
char array1[18] = {"abcdefg"}; char array2[18]; size_t destination_size = sizeof (array2); strncpy(array2, array1, destination_size); array2[destination_size - 1] = '\0';
最后一行实际上很重要,因为strncpy()
并不总是终止string。 (如果目标缓冲区太小而不能包含整个源string,sntrcpy()将不会终止目标string。)
strncpy()的手册页甚至声明“警告:如果在src的前n个字节中没有空字节,放在dest中的string将不会以null结尾。
strncpy()的行为有点奇怪,因为它实际上并不是作为复制string的安全方式。
另一种方法是使用snprintf()作为strcpy()的安全replace:
snprintf(array2, destination_size, "%s", array1);
(感谢user315052提示。)
使用memcpy(array1, array2, sizeof(array2));
如果你的数组不是string数组。
您不能分配数组,名称是不能更改的常量。
您可以复制的内容 ,与:
strcpy(array2, array1);
假设源是一个有效的string,并且目标足够大,如你的例子。
正如其他人所指出的,string是用strcpy()
或其变体复制的。 在某些情况下,你也可以使用snprintf()
。
您只能按照您希望的方式将数组指定为结构分配的一部分:
typedef struct { char a[18]; } array; array array1 = { "abcdefg" }; array array2; array2 = array1;
如果你的数组被传递给一个函数,那么看起来你可以分配它们,但这只是语义的一个意外。 在C中,一个数组将衰减到一个指针types的数组的第一个成员的地址的值,这个指针是传递。 所以,你的函数中的数组参数实际上只是一个指针。 赋值只是一个指针赋值:
void foo (char x[10], char y[10]) { x = y; /* pointer assignment! */ puts(x); }
从函数返回后,数组本身保持不变。
对数组来说,这个“衰减到指针值”的语义是分配不起作用的原因。 l值具有数组types,但是r值是衰减的指针types,所以赋值在不兼容的types之间。
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语言的开发”了解详细信息。
它应该是这样的:
void cstringcpy(char *src, char * dest) { while (*src) { *(dest++) = *(src++); } *dest = '\0'; } ..... char src[6] = "Hello"; char dest[6]; cstringcpy(src, dest);
array2 = array1;
c不支持。 你必须使用像strcpy()这样的函数来完成。
我build议使用memcpy()来复制数据。 另外,如果我们将一个缓冲区分配给另外一个array2 = array1
,则两个数组都具有相同的内存,并且arrary1中的任何更改也会在array2中偏移。 但是我们使用memcpy,两个缓冲区都有不同的数组。 我build议memcpy()因为strcpy和相关函数不要复制NULL字符。
c函数只在下面… c + +你必须做字符数组,然后使用string副本然后用户stringtokenizor函数… 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; }
对于整数types
#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
数组,如果知道源数组是null终止的,并且目标数组对于源数组中的string(包括空终止符strcpy()
足够大,请使用strcpy()
:
#include <string.h> char array1[18] = "abcdefg"; char array2[18]; ... strcpy(array2, array1);
如果您不知道目标数组是否足够大,但源是Cstring,并且希望目标是合适的Cstring,请使用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);