【问题标题】:Replacing character within cstring - getting bad access替换 cstring 中的字符 - 访问错误
【发布时间】:2013-10-22 05:38:49
【问题描述】:

通过UTF8string方法从NSString转换后,是否可以替换c字符串中的字符?

以下面的代码为例。就是用特定的规则格式化一个字符串。

- (NSString *)formatString:(NSString *)input {
    if (input.length==0) {
        return @"";
    }
    //code to determine rule
    ....
    ....
    // substitute output format with input characters
    if (rule) {
        input = [input substringFromIndex:prefix.length];
        char *string = (char *)[rule UTF8String];
        int repCount = 0;
        for (int i=0; i<rule.length; i++) {
            if (string[i] == '#') {
                if (repCount < input.length) 
                    string[i] = [input characterAtIndex:repCount++];//bad access
                else 
                    string[i] = ' ';
            }
        }
        NSMutableString *output = [NSMutableString stringWithCString:string encoding:NSUTF8StringEncoding];
     ...
     ... //do something with the output 
    return output;
    } else {
    return input;
    }
}

最初 string[0] 有 '#',它应该被替换为输入中的字符。这不会发生。

【问题讨论】:

  • 能否提供您使用的规则前缀和输入示例?
  • 我真的很抱歉,因为我不能这样做,它是私人的 :-)

标签: objective-c nsstring


【解决方案1】:

总之,不。那个缓冲区不属于你,所以别管它。

【讨论】:

  • 有趣的是,我有这段代码可以在应用程序的早期版本中运行,即使我现在单步执行它!但它现在不起作用:-D。顺便说一句,我在其他线程中看到了你关于字符串替换的答案,所以我相信你的话。
  • @thandasoru 这是未定义的行为,因此可能随时中断。我会将字符串提取到一个缓冲区(unichar 对象),您可能可以使用这个属于您的缓冲区使用相同的算法。
  • 我只是创建了一个 char 缓冲区,使用 for 循环复制字符并使用新缓冲区进行替换,就像您在上面所说的那样,它就像一个魅力!
  • @thandasoru 不错。
【解决方案2】:

几个问题:

  1. 您正在将UTF8String 转换为char *,这将返回一个const char *UTF8String 根据定义返回一个只读字符串,您应该这样使用它。 (如果有的话,你真的应该谨慎使用转换。当然永远不要使用转换来覆盖变量的const 限定符。)

    如果你想执行这个 C 字符串操作,你必须将字符串复制到你自己的缓冲区。例如,使用getCStringgetCharacters 方法(但仅在您创建缓冲区来接收它们之后,并记住为NULL 终止符添加一个字符)。

  2. 顺便说一句,您还返回了characterAtIndex,它是一个unichar(可以大于8 位),并在您的char * 缓冲区中使用它(每个字符8 位)。我会谨慎地混合和匹配那些而不非常小心。最好选择一个并坚持下去(unichar 对那些非 8 位字符提供了更多的容忍度)。

  3. 也许您之前检查过这个,但是您将string 设置为prefix 之后的那些字符,然后继续检查下一个rule.length 字符数。但是,据我所知,您无法保证string 实际上还剩下那么多字符。您应该对此进行测试,否则也会导致问题。

就我个人而言,我会停用整个 C 字符串算法并使用适当的 NSString 和/或 NSMutableString 方法来做任何你想要的替换,例如stringByReplacingCharactersInRangestringByReplacingOccurrencesOfString 或等效的 NSMutableString 方法、replaceCharactersInRangereplaceOccurrencesOfString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2016-02-08
    • 2019-03-02
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多