2016-08-16 9 views
0

Я хочу назначить массив другому массиву. Оба массива не имеют одинаковый размер:Как назначить массив символов другому массиву символов с другим размером в C

char array1[7] = "abcdefg"; 
char array2[3]; 

Как я могу назначить три (3) значения из array1 в массив 2? Я попробовал так:

array2[3] = {array1[2], array1[3], array1[4]}; 

и стать я бы следующее сообщение об ошибке:

expected expression before ´{´token 

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

У меня больше опыта с VHDL и verilog. В VHDL это может выглядеть так:

array2 := arry1(2 upto 4); 

Но у меня нет большого опыта программирования С.

Спасибо

+0

Что не так с использованием 'memcpy', когда размеры разные? – Kevin

+1

Вы можете использовать 'memcpy()', если область непрерывна (и не перекрывается): 'memcpy (array2, arrray1 + 2, 3);' – MikeCAT

+0

Просто потому, что вы знаете, что VHDL не означает, что речь идет об этом. Удаленный тег. – Olaf

ответ

0

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

memcpy(array2, array1 + 2, 3); 

или просто написать свой собственный цикл копирования:

for (int i = 0; i < 3; i++) array2[i] = array1[i + 2]; 

Обратите внимание, что, в зависимости от окружающий код и ваши компиляторы C и параметры оптимизации, эти два метода могут или не могут завершиться компиляцией в один и тот же двоичный файл. В частности, вполне возможно, чтобы оптимизирующий компилятор как встроил memcpy(), так и преобразовал явный цикл копирования в вызов memcpy(), в зависимости от того, что, по мнению компилятора, будет наиболее эффективным.

Также обратите внимание, что если массивы имеют какой-либо тип, отличный от char, аргумент длины memcpy() необходимо умножить на размер элемента в байтах. Однако стандарт C гарантирует, что sizeof(char) == 1.

2

При инициализации вашего array2[3], вы можете скопировать значения, как вы делаете

Просто сделай это,

char array1[7] = "abcdefg"; 
char array2[3] = {array1[2], array1[3], array1[4]}; 
+0

'char array2 [] = {array1 [2], array1 [3], array1 [4]};' будет достаточным, так как вы не используете инициализатор строки. –

+0

Если вы определяете как 'array2 [3]' вместо 'array2 []', этого не будет достаточно – Berkay92

+2

Это будет достаточно просто, если вы хотите * символьный массив *, если вы хотите 'string', тогда вам нужно пространство для * nul-terminator *. Ваш ответ подходит для массива, я просто указывал, что вы можете оставить * количество элементов * пустым, и компилятор установит его. Итак, в нижней строке, это зависит от того, как вы собираетесь использовать 'array2'. –

0

Это работает на Windows 7

#include <stdio.h> 
#include <string.h> 

int main() { 
    char array1[7] = "abcdefg"; 
    char array2[3]; 
    strncpy(&array2[0],&array1[2],3); 
    printf("%s\n",array2); 
} 

Выход:

CDE

1

Если вы действительно имеете в виду назначения, то вы можете использовать стандартную функцию еру strncpy объявленной в заголовке <string.h>.

Вот показательная программа

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char array1[7] = "abcdefg"; 
    char array2[4]; 
    size_t n = 3; 

    strncpy(array2, array1 + 2, n); 
    array2[n] = '\0'; 

    puts(array2); 

    return 0; 
} 

Его выход

cde 

Примите во внимание, что если вы хотите, чтобы массив array2 будет содержать строку, то ее размер должен быть равен 4 до сохраните три скопированных символа и завершающий нуль.

+0

Обратите внимание, что 'strncpy()' остановится, если встретит нулевой байт. Это то, что вы хотите, если работаете с строками с нулевым завершением (как кажется, предполагается, что этот ответ предполагается), но если вы пытаетесь скопировать двоичные данные (которые могут содержать нулевые байты в качестве допустимых элементов), то вы хотите «memcpy() вместо этого. –