4

我是 Objective-C 编程的新手,当我运行我的小程序时收到此错误(我只想生成一个随机字符)。所以这是我到目前为止所做的:

(IBAction)generate{
  int a = arc4random() % 26;
  NSString * chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char lettre = [chaine characterAtIndex:a];

  NSMutableString * mot = [[NSMutableString alloc] initWithCharacters:lettre length:1];
  hasard.text = mot;
}

我试图简单地将我的变量“lettre”放在 hasard.text 中,但它不适用于错误“不兼容的整数到指针转换分配给NSString *”从“ char”。所以我创建了一个NSMutableString来包含我的角色。

当我在第五行手动输入字符“e”而不是变量“字母”时,效果很好。既然我可以在调试器中看到“lettre”包含一个随机字母,为什么我会在标题中得到错误?

(EXC_BAD_ACCESS (code=2, address=0x42)).

4

5 回答 5

6

该函数需要一个指向字符的指针,您正在给它一个文字字符。您需要创建一个指向它的指针。此外,characterAtIndex不会像您想象的那样返回字符。它返回一个unicode 字符,它实际上是一个unsigned short而不是一个unsigned char. 但是,如果您将代码更改为此它将起作用:

const unichar foo = [@"Test" characterAtIndex:0];
NSString *test = [NSString stringWithCharacters:&foo length:1]; //Note the &

编辑但最简单的方法就是:

char randChar = arc4random_uniform(26) + 'A'; //Changed in response to Jason Coco's comment
NSString *mot = [NSString stringWithFormat:@"%c", randChar];
于 2012-06-13T03:47:29.677 回答
1

您需要传递某种类型的东西const unichar *,而不仅仅是char. 你可以这样做:

- (IBAction)generate {
  int a = arc4random() % 26;
  NSString * chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  NSMutableString * mot = [chaine substringWithRange:NSMakeRange(a,1)];
  hasard.text = mot;
}

这样,您就可以完全避免 c 字符串胡说八道。

于 2012-06-13T03:42:11.783 回答
0

对于[NSMutableString initWithCharacters:length:],它接受 a C array of Unicode characters,而不是char

实际上,您可以对旧字符串进行子串化并通过[NSMutableString initWithString].

于 2012-06-13T03:43:41.730 回答
0

initWithCharacters:length:不将单个字符作为其第一个参数。它需要一个 unichars 数组(当然作为指针)。如果您将单个字符传递给它,它将尝试取消引用解释为指针的字符,并且出现段错误。

顺便说一句,您生成单字母子字符串的方法太复杂了。我们有sustringWithRange:方法,所以使用它:

- (IBAction)generate{
    int a = arc4random() % 26;
    NSString *chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSString *mot = [chaine substringWithRange:NSMakeRange(a, 1)];
    hasard.text = mot;
}

此外,即使这种方法也过于复杂。正如@borrrden 指出的那样,只需使用

(arc4random() % 26) + 'A'

反而。

于 2012-06-13T03:50:01.663 回答
0

万一有人仍然访问这个问题,要检查的另一件有用的事情是确保您没有使用 ios6 特定代码,而是在 ios5 模拟器中......这就是导致并解决了我的问题的原因!

于 2013-06-18T22:36:30.723 回答