输入一个字符串在 C 中修改它并输出它

在这个例子中,我们在 MATLAB MEX 中说明了字符串操作。我们将创建一个 MEX 函数,它接受一个字符串作为 MATLAB 的输入,将数据复制到 C 字符串,修改它并将其转换回 mxArray 返回到 MATLAB 端。

这个例子的主要目的是展示如何从 MATLAB 将字符串转换为 C / C++,反之亦然。

stringIO.cpp

#include "mex.h"
#include <cstring>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    // check number of arguments
    if (nrhs != 1 || nlhs > 1) {
        mexErrMsgIdAndTxt("StringIO:WrongNumArgs", "Wrong number of arguments.");
    }

    // check if input is a string
    if (mxIsChar(prhs[0])) {
        mexErrMsgIdAndTxt("StringIO:TypeError", "Input is not a string");
    }

    // copy characters data from mxArray to a C-style string (null-terminated)
    char *str = mxArrayToString(prhs[0]);

    // manipulate the string in some way
    if (strcmp("theOneString", str) == 0) {
        str[0] = 'T';  // capitalize first letter
    } else {
        str[0] = ' ';  // do something else?
    }

    // return the new modified string
    plhs[0] = mxCreateString(str);

    // free allocated memory
    mxFree(str);
}

此示例中的相关功能是:

  • mxIsChar 测试 mxArray 是否属于 mxCHAR 型。
  • mxArrayToStringmxArray 字符串的数据复制到 char *缓冲区。
  • mxCreateStringchar*创建一个 mxArray 字符串。

作为旁注,如果你只想读取字符串而不是修改它,请记住将其声明为 const char*以获得速度和稳健性。

最后,编译后我们可以从 MATLAB 中调用它:

>> mex stringIO.cpp

>> strOut = stringIO('theOneString')
strOut = 
TheOneString

>> strOut = stringIO('somethingelse')
strOut=
omethingelse