C / C ++ копия из массива

0

Я хочу скопировать набор символов из массива, от индекса к другому. Например, у меня есть массив char array[64] и я хочу выбрать символы из let say 5-15 и сохранить их в другом массиве char. Я мог бы сделать это с циклом for, но есть ли какая-то функция, которая делает это? Как подстрока метода С#. Заранее спасибо.

  • 1
    Использовать std::copy ? Кстати, эти два языка не очень продуктивны.
  • 1
    Я уверен, что вы найдете много ответов, если выполните поиск по strncpy() и / или std::copy() .
Теги:
string
arrays

7 ответов

4
Лучший ответ

Вы всегда можете использовать memcpy для достижения этого, и в любом случае это будет более эффективно.

char a[100] = {0};
char b[100] = {1};
memcpy(&a[10], &b[30], 10);
  • 0
    Это в основном неоперация. Вы копируете нули в нули.
  • 0
    Это пример, а не производственный код.
Показать ещё 5 комментариев
2

C++: используйте std::copy_n:

#include <algorithm>

int main() {
    char a[100] = {0};
    char b[100] = {1};
    std::copy_n(&a[10], 10, &b[30]);
}
1

Вы действительно задали два довольно разных вопроса, и (до сих пор) большинство ответов, которые вы получили, сосредоточились исключительно на одном.

Ответ, на который они ответили, - это копирование символов в массивы.

Однако в конце вашего вопроса вы говорите: "Как подстрока метода С#".

Это действительно указывает в совершенно другом направлении: по крайней мере, в C++ (но не в C) ближайшим эквивалентом С# Substring является std::string substr. Например:

std::string a("12345678");

std::string b = a.substr(2,3); // b == 345

std::string также предоставляет ряд конструкторов, которые позволяют создавать одну строку в качестве подстроки другого, чтобы вы могли добиться такого же эффекта:

std::string b = std::string(a, 2, 3);

Мой немедленный совет: если вы собираетесь писать C++, напишите реальный C++. Особенно с подобием в синтаксисе, легко представить себе C++ как C с несколькими дополнительными колокольчиками и свистами.

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

1

Существует несколько подходов. Например, вы можете использовать стандартную функцию C strncpy. Например

strncpy( dest, source + 5, 11 );

Или вы можете использовать стандартный алгоритм C++ std::copy. Например

std::copy( source + 5, source + 16, dest );

Или вы можете использовать стандартный алгоритм 'std :: copy_n. Например

std::copy_n( source + 5, 11, dest );

Но если вы будете использовать лямбда-выражения, то набор стандартных алгоритмов, которые могут быть использованы для этой операции, будет увеличен. :)

  • 0
    Может быть источник +4, если вы после 5 символов? Хорошее место на 11, а не на 10, хотя
  • 0
    @Hiet, как я понял начальный индекс 5.
Показать ещё 1 комментарий
0
#include <string.h>

char array[64];
char new_array[12]; /* 12th char for '\0' */

/* put some data into array */

/* copy chars 5-15 (11 chars) from array to new_array */
strncpy(new_array, &array[4], 11);
  • 0
    Пожалуйста, добавьте некоторые объяснения.
  • 0
    Вам понятнее?
Показать ещё 1 комментарий
0

memcpy или memmove будет перемещать весь блок за один выстрел и исключать цикл.

0

В C вы можете использовать стандартную библиотечную функцию memcpy.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню