Я хотел бы объединить 2 строки в C или C ++ без нового выделения памяти и копирования. Является ли это возможным?
Возможный код C:
Затем, когда они мне больше не нужны, я просто делаю:
Или, если возможно, я хотел бы добиться того же в C ++, используя std::string или, может быть char* , но используя new а также delete (возможно, void operator delete ( void* ptr, std::size_t sz ) оператор (C ++ 14) на стр3).
Есть много вопросов о конкатенации строк, но я не нашел тот, который спрашивает то же самое.
Решение
нет, это невозможно
В C операции malloc возвращают блоки памяти, которые не имеют отношения друг к другу. Но в C строки должны быть непрерывным массивом байтов. Таким образом, нет способа расширить str1 без копирования, не говоря уже о конкатенации.
Для C ++ может быть интересны веревки: Смотрите этот ответ .
Веревки выделяются кусками, которые не должны быть смежными. Это поддерживает O (1) сцепление. Тем не менее, методы доступа заставляют его выглядеть как одна строка байтов. Я уверен, что для преобразования веревок обратно в std :: string или строки в стиле C потребуется копия, но это, вероятно, самое близкое к тому, что вы хотите.
Кроме того, вероятно, преждевременная оптимизация беспокоит затраты на копирование нескольких строк. Если вы не двигаетесь много данных, это не имеет значения
Другие решения
Конкатенация текста возможна путем написания вашей собственной строковой структуры данных. Проще на C ++, чем на C.
Вам придется реализовать все алгоритмы обработки текста и поиска, основанные на этой структуре данных. Ничто в библиотеке C не может быть применено к My_String состав. std::string в C ++ не будет совместимым.
Одним из вопросов является то, как обрабатывать изменения текста. Если один из фрагментов текста является константным литералом (который не может быть изменен), его необходимо будет скопировать, прежде чем он может быть изменен. Но копирование противоречит требованиям.
«Строка» в C — это массив символов с нулевым символом в конце. А массив — это «структура данных, которая позволяет хранить один или несколько элементов последовательно в памяти». Ссылка на GNU C
Вы не можете объединить два массива, которые не находятся в последовательных блоках памяти, без копирования одного из них. Однако вы можете сделать это без выделения новой памяти. Например.
Вы можете, если хотите, получить символы из 2 строк, как если бы они были одной, без копирования или перераспределения. Вот пример функции для этого (простой пример, не используйте в производственном коде)
Но в таком случае вы не могли бы иметь char* str3 выполнить арифметику указателей и получить доступ ко всем 150 символам.
Тэги C и C ++ противоречивы. В Си, я бы рекомендовал исследовать realloc , Вы можете кодировать что-то в следующем формате:
Если вам повезет, то realloc call не перераспределяет новую память и просто «расширяет» уже выделенный сегмент, но на это нет никаких гарантий. Таким образом, вы, по крайней мере, можете избежать перераспределения строки. Вам все равно придется скопировать содержимое второй строки в выделенную память neweley.
Объединение подразумевает добавление одной строки к концу другой. Concatenation is the process of appending one string to the end of another string. Вы можете сцеплять строки с помощью оператора + . You concatenate strings by using the + operator. Строковые литералы и константы сцепляются во время компиляции, а не во время выполнения. For string literals and string constants, concatenation occurs at compile time; no run-time concatenation occurs. Строковые переменные сцепляются только во время выполнения. For string variables, concatenation occurs only at run time.
Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. The C# examples in this article run in the Try.NET inline code runner and playground. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. Select the Run button to run an example in an interactive window. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Once you execute the code, you can modify it and run the modified code by selecting Run again. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#. The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.
Следующий пример показывает использование сцепки для разделения длинного строкового литерала на строки меньшего размера, чтобы повысить удобочитаемость исходного кода. The following example uses concatenation to split a long string literal into smaller strings in order to improve readability in the source code. Эти части объединяются в одну строку во время компиляции. These parts are concatenated into a single string at compile time. Количество строк не влияет на производительность во время выполнения. There is no run-time performance cost regardless of the number of strings involved.
Для сцепки строковых переменных вы можете использовать операторы + или += , интерполяцию строк, а также методы String.Format, String.Concat, String.Join или StringBuilder.Append. To concatenate string variables, you can use the + or += operators, string interpolation or the String.Format, String.Concat, String.Join or StringBuilder.Append methods. Оператор + прост в использовании и позволяет получить интуитивно понятный код. The + operator is easy to use and makes for intuitive code. Даже если в одном выражении используется несколько операторов + , содержимое строки копируется только один раз. Even if you use several + operators in one statement, the string content is copied only once. В следующем коде показаны примеры использования операторов + и += для сцепки строк: The following code shows examples of using the + and += operators to concatenate strings:
В некоторых выражениях строки проще сцепить с помощью интерполяции, как показано в следующем коде: In some expressions, it’s easier to concatenate strings using string interpolation, as the following code shows:
В операциях сцепки строк компилятор C# обрабатывает строки NULL так же, как пустые строки. In string concatenation operations, the C# compiler treats a null string the same as an empty string.
Другие методы сцепки строк: String.Format. Other method to concatenate strings is String.Format. Этот метод лучше использовать при создании строки из небольшого числа строк-компонентов. This method works well when you are building a string from a small number of component strings.
В других случаях вы можете сцеплять строки во время цикла и не знать, сколько исходных строк вы сцепляете. При этом фактическое число исходных строк может быть довольно большим. In other cases you may be combining strings in a loop, where you don’t know how many source strings you are combining, and the actual number of source strings may be quite large. Для этих сценариев предназначен класс StringBuilder. The StringBuilder class was designed for these scenarios. В следующем коде для сцепки строк используется метод Append класса StringBuilder. The following code uses the Append method of the StringBuilder class to concatenate strings.
Другой вариант объединения строк из коллекции — использовать метод String.Concat. Another option to join strings from a collection is to use String.Concat method. Используйте метод String.Join, если исходные строки должны быть разделены разделителем. Use String.Join method if source strings should be separated by a delimeter. Следующий код объединяет массив слов с помощью обоих методов: The following code combines an array of words using both methods:
Другой вариант объединения строк из коллекции — использовать LINQ и метод Enumerable.Aggregate. At last, you can use LINQ and the Enumerable.Aggregate method to join strings from a collection. Этот метод объединяет исходные строки с помощью лямбда-выражения. This method combines the source strings using a lambda expression. Лямбда-выражение добавляет каждую строку к существующему накоплению. The lambda expression does the work to add each string to the existing accumulation. Следующий пример показывает объединение массива слов путем добавления пробелов между словами. The following example combines an array of words by adding a space between each word in the array:
Вы можете оценить эти примеры, просмотрев код в нашем репозитории GitHub. You can try these samples by looking at the code in our GitHub repository. Или можете загрузить образцы в ZIP-файле. Or you can download the samples as a zip file.
Пишу курсовой по MFC. В нем использую MySQL. Что можно использовать для удобной конкатенации строк — надо постоянно из форм, вставлять в чаровскую строку (запрос) и передавать. Понял, что как PHP не получится)
Что выбрать из такого обилия строчных типов? CString, string, char * или еще что?

4 ответа 4
Выбирай string , конкатенация делается так str3 = str1 + str2 .
Функция strcat присоединяет к строке, переданной первым параметром, строку, переданную вторым параметром. В данном случае строки — это массивы элементов типа char. В C++ массивы не являются динамическими структурами, то есть не могут изменять свой размер во время выполнения программы. Поэтому в массиве (строке), переданном первым параметром в strcat , должно быть достаточно места, чтобы туда поместились обе строки. Объявляя строку так
вы создаёте массив char’ов размером ровно в длину строки » proger » (плюс один элемент под нуль-терминатор). Если вы хотите сложить две строки, вам придётся выделить память под результат:
Есть и другие способы. Например, с использованием класса stringstream:

Класс лучше всего использовать естественно string т.к. это стандартный класс с++. В нём есть перегруженный оператор +=, который добавляет символы и метод append.
class string — более подробная инфа
Ещё есть класс System::String , в нём конкатенация выполняется через знак сложения, как в ПХП, но этот класс работает только в Visual Studio.