Обработка строк на C/C++

Как MATLAB представляет строки в файлах MEX

В файлах MEX C/C++ вектором символов MATLAB® является mxArray типа mxChar, с помощью нейтрального в отношении локали представления данных (кодирование Unicode®). MATLAB представляет строки C-стиля как тип char и использует схему кодировки символов, заданную пользовательской установкой локали.

Следующие Матричные API-функции C обеспечивают функции обработки строки, чтобы помочь вам работать и с mxArrays и со строками C-стиля.

  • mxCreateString — Создает mxChar mxArray, инициализированный к входной строке.

  • mxArrayToString — Копирует mxChar mxArray в строку C-стиля. Поддерживает многобайтовые закодированные символы.

  • mxGetString — Копирует mxChar mxArray в строку C-стиля. Лучше всего используемый с однобайтовыми закодированными символами. Поддерживает многобайтовые закодированные символы, когда вы вычисляете buffer size строки.

  • mxGetChars — Возвращает указатель на первый элемент mxChar в mxArray.

Рассмотрите следующие темы при выборе функции обработки строки.

Кодировка символов и многобайтовые схемы кодирования

MATLAB поддерживает схему кодировки символов, заданную пользовательской установкой локали. Когда Библиотечная функция MX преобразовывает данные mxChar в тип char C, MATLAB также преобразовывает символ в пользовательскую кодировку по умолчанию.

Если вы используете многобайтовую схему кодирования, используйте функцию mxArrayToString.

Функция mxGetChars обеспечивает указатель на массив mxChar; это не изменяет кодировку символов.

Можно также использовать функцию mxGetString с многобайтовыми схемами кодирования. mxGetString преобразовывает данные mxChar в вашу пользовательскую кодировку по умолчанию и копирует преобразованные символы в целевой буфер. Однако необходимо вычислить размер целевого буфера. Для однобайтового кодирования размер буфера является количеством символов плюс 1 для пустого терминатора строки. Для многобайтового кодирования размер символа является одним или несколькими байтами. Некоторые опции для вычисления buffer size должны переоценить сумму (вычисление номера времен символов максимальное количество байтов, используемых схемой кодирования), анализировать строку, чтобы определить точный размер, используемый каждым символом или использовать сторонние буферные библиотеки строки. После этого вычисления добавьте 1 для пустого терминатора строки.

Преобразование вектора символа MATLAB к строке C-стиля

Когда вы передаете символьный массив MEX-функции, это - mxArray типа mxChar. Если вы вызываете функцию C, чтобы управлять строкой, сначала преобразовать данные в тип C char с помощью функций mxGetString или mxArrayToString.

Преобразование строки C-стиля к вектору символа MATLAB

Если ваш файл MEX создает струну до и возвращает данные в MATLAB, используйте функцию mxCreateString, чтобы скопировать струну до в массив mxChar.

Возврат измененной входной строки

Предположим, что ваш файл MEX берет символьный вход, изменяет его и возвращает результат. Поскольку файл MEX ввел параметры (массив prhs) только для чтения, необходимо задать отдельный выходной параметр, чтобы обработать измененную строку.

Управление памятью

MathWorks® рекомендует, чтобы функции файла MEX уничтожили свои собственные временные массивы и освободили их собственную динамически выделенную память. Функция, которую вы используете, чтобы выпустить память, зависит от того, как вы используете буфер строки и что функционирует, вы используете, чтобы создать буфер.

Если вы вызываете эту функцию

Выпустите память Используя эту функцию

Любая строковая функция перечислена здесь

Не уничтожайте mxArray в исходном файле MEX, когда это будет:

  • Пройден к файлу MEX в правой стороне перечисляют prhs[].

  • Возвращенный в левой стороне перечисляют plhs[].

  • Возвращенный функцией mexGetVariablePtr.

  • Используемый, чтобы создать структуру.

mxArrayToString

mxFree

mxGetString

При использовании mxCalloc / mxMalloc / mxRealloc, чтобы создать входной параметр buf, вызовите mxFree(buf).

mxCreateString

mxDestroyArray

mxGetChars

'none'. Функция создает указатель на mxArray, но не выделяет дополнительную память.

Похожие темы