【问题标题】:Converting string from C++ to Swift将字符串从 C++ 转换为 Swift
【发布时间】:2022-01-11 01:28:14
【问题描述】:

我正在尝试在 Swift 中使用 C++ 函数。为此,我使用了一个 Objective-C 包装器。我对Objective-C和C++不是很熟悉。

我的 wrapper 函数将 Swift 字符串作为来自 textField 的参数。在 C++ 内部,我加密传递的字符串并返回它。

这是我的 C++ 函数:

string StringModifier::encryptString(string str) {
    int i;
    for(i=0; (i<100 && str[i] != '\n'); i++) {
        str[i] = str[i] + 2;
    }
    return str;
}

在包装器内部:

StringModifier stringModifier;

-(NSString*)encryptString:(NSString*)str; {
    string strng = [str UTF8String];
    string finalString = stringModifier.encryptString(strng);
    NSString *result = [NSString stringWithCString: finalString.c_str() encoding:[NSString defaultCStringEncoding]];
    return result;
}

encryptString("Helloworld") 的输出是 "Jgnnqyqtnf¬√√0*?" 多次调用此方法后,会抛出 EXC_BAD_ACCESS 错误。

我该如何解决这个问题?

【问题讨论】:

  • 你能在for循环条件下试试i&lt;100 &amp;&amp; str[i] != '\n' &amp;&amp; str[i] != '\0'吗?
  • 这实际上解决了我的问题。从没想过这是Cpp方面的问题。非常感谢。
  • 为它添加了答案:)

标签: c++ swift objective-c nsstring objective-c++


【解决方案1】:

您需要在 C++ 中检查空字符 (\0)。

将你的 for 循环更改为:

for(i=0; (i<100 && str[i] != '\n' && str[i] != '\0'); i++) {
    str[i] = str[i] + 2;
}

更好的是,根据字符串的大小循环:

string StringModifier::encryptString(string str) {
    for (int i = 0; i < str.size() && str[i] != '\n'; i++) {
        str[i] = str[i] + 2;
    }
    return str;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多