我是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”而不是变量“letter”时,效果很好。因为我可以在调试器中看到'lettre'包含一个随机字母,为什么我会在标题中得到错误?
(EXC_BAD_ACCESS (code=2, address=0x42))
。
答案 0 :(得分: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];
答案 1 :(得分:1)
您需要传递const unichar *
类型的内容,而不只是char
。你可以这样做:
- (IBAction)generate {
int a = arc4random() % 26;
NSString * chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString * mot = [chaine substringWithRange:NSMakeRange(a,1)];
hasard.text = mot;
}
这样你就完全避开了c string baloney。
答案 2 :(得分:0)
对于[NSMutableString initWithCharacters:length:]
,它接受C array of Unicode characters
,而不是char
。
实际上你可以将旧字符串&通过[NSMutableString initWithString]
使用字符串。
答案 3 :(得分: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'
代替。
答案 4 :(得分:0)
答案 5 :(得分:0)
以防任何人仍然访问这个问题,另一个有用的检查方法是确保你不使用ios6特定的代码但是在ios5模拟器中......这就是为我带来并解决问题的原因!