Как скопировать массив символов в 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() не завершит строку назначения нулем.)

manpage для strncpy() даже состояния "предупреждение: если нет null байт среди первых n байтов src строка, помещенная в dest, не будет иметь нулевого завершения."

причина, по которой strncpy() ведет себя несколько странно, заключается в том, что изначально он не был предназначен для безопасного копирования строк.

другой способ-использовать snprintf () в качестве безопасной замены strcpy ():

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

(спасибо снайперов боссов и тд за совет.)


Если массивы не являются строковыми массивами, использовать: 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() для копирования данных. Также, если мы назначим буфер другому as array2 = array1, оба массива имеют одинаковую память и любое изменение в arrary1 отклоняется в array2 тоже. Но мы используем memcpy, оба буфера имеют разные массивы. Я рекомендую memcpy (), потому что strcpy и связанная с ним функция не копируют нулевой символ.


функции c ниже только ... c++ вы должны сделать массив char, затем использовать строковую копию, а затем использовать строковые функции 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);

если исходный массив не обязательно завершается null, но вы знаете, что оба массива имеют одинаковый размер, вы можете использовать memcpy:

#include <string.h>

char array1[28] = "a non null terminated string";
char array2[28];

...

memcpy(array2, array1, sizeof array2);