Как скопировать массив символов в C?
В C, у меня есть два массива символов:
char array1[18] = "abcdefg";
char array2[18];
Как скопировать значение array1
to array2
? Могу ли я просто сделать это:array2 = array1
?
11 ответов:
вы не можете напрямую сделать
array1 = array2
. Потому что в этом случае вы будете манипулировать адресами (char *
) массивов, а не их значения.для такого рода ситуации рекомендуется использовать
strncpy
избежать переполнение буфера, особенно еслиarray1
заполняется из пользовательского ввода (Клавиатура, сеть и т. д.). Вот так:// Will copy 18 characters from array1 to array2 strncpy(array2, array1, 18);
как @профессор Falken и упомянул в комментарии
strncpy
может быть зло. Убедитесь, что ваш целевой буфер достаточно велик, чтобы содержать исходный буфер (включаяв конце строки).
Если вы хотите защитить от незаконченных строк, которые могут вызвать всевозможные проблемы, скопируйте строку следующим образом:
char array1[18] = {"abcdefg"}; char array2[18]; size_t destination_size = sizeof (array2); strncpy(array2, array1, destination_size); array2[destination_size - 1] = '';
эта последняя строка на самом деле важна, потому что
strncpy()
не всегда null terminate строки. (Если буфер назначения слишком мал, чтобы содержать всю исходную строку, sntrcpy() не будет null завершать строку назначения.)manpage для strncpy () даже состояния "предупреждение: если нет null байт среди первых n байтов src строка, помещенная в dest, не будет завершаться нулем."
причина, по которой strncpy() ведет себя несколько странно, заключается в том, что он изначально не был предназначен для безопасного копирования строк.
другой способ-использовать snprintf () в качестве безопасной замены strcpy ():
snprintf(array2, destination_size, "%s", array1);
(спасибо jxh за совет.)
Если массивы не являются строковыми массивами, использовать:
memcpy(array2, array1, sizeof(array2));
вы не можете назначить массивы, имена являются константами, которые не могут быть изменены.
вы можете скопировать содержание С:
strcpy(array2, array1);
предполагая, что источник является допустимой строкой и что назначение достаточно велико, как в вашем примере.
как отмечали другие, строки копируются с помощью
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-значение имеет тип массива, но r-значение является типом распадающегося указателя, поэтому назначение находится между несовместимыми типы.
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 = ''; } ..... char src[6] = "Hello"; char dest[6]; cstringcpy(src, dest);
array2 = array1;
Не поддерживается в c. Вы должны использовать такие функции, как strcpy () сделать это.
Я рекомендую использовать memcpy() для копирования данных. Также, если мы назначаем буфер другому как
array2 = array1
, оба массива имеют одинаковую память и любое изменение в arrary1 отклоняется в array2 тоже. Но мы используем memcpy, оба буфера имеют разные массивы. Я рекомендую memcpy (), потому что strcpy и связанная с ним функция не копируют нулевой символ.
C функции только ниже ... c++ вы должны сделать массив символов, а затем использовать строковую копию, а затем использовать строковые функции tokenizor... c++ сделал это-намного сложнее сделать anythng
#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] = ''; //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; }
для типов integer
#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);
если исходный массив не обязательно завершается нулем, но вы знаете, что оба массива имеют одинаковый размер, вы можете использовать
memcpy
:#include <string.h> char array1[28] = "a non null terminated string"; char array2[28]; ... memcpy(array2, array1, sizeof array2);