Как скопировать массив символов в C?


В C, у меня есть два массива символов:

char array1[18] = "abcdefg";
char array2[18];

Как скопировать значение array1 to array2 ? Могу ли я просто сделать это:array2 = array1?

11 56

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);