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、自分のキャラクターを含む を作成しました。

5 行目に変数「letter」の代わりに文字「e」を手動で配置すると、うまく機能します。「lettre」にランダムな文字が含まれていることがデバッガーで確認できるのに、タイトルにエラーが表示されるのはなぜですか?

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

4

5 に答える 5

6

関数は文字へのポインターを期待しています。リテラル文字を指定しています。それへのポインタを作成する必要があります。また、characterAtIndexあなたが思うように文字を返しません。実際にはではなく であるUnicode 文字を返します。ただし、コードを次のように変更すると機能します。unsigned shortunsigned 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

誰かがまだこの質問にアクセスしている場合に備えて、もう 1 つチェックするのに役立つことは、ios6 固有のコードを使用していないことを確認することですが、ios5 シミュレーターで使用していることを確認してください...これが問題の原因であり、解決しました!

于 2013-06-18T22:36:30.723 に答える
0

の場合、の代わりに , を[NSMutableString initWithCharacters:length:]受け入れます。C array of Unicode characterschar

実際には、古い文字列をサブストリング化して、 を介して文字列を使用できます[NSMutableString initWithString]

于 2012-06-13T03:43:41.730 に答える
0

initWithCharacters:length:最初の引数として単一の文字を取りません。unichars の配列を取ります (もちろんポインターとして)。単一の文字を渡すと、ポインターとして解釈された文字を逆参照しようとし、segfaultが発生します。

ところで、1 文字の部分文字列を生成するために取っているアプローチは、あまりにも複雑です。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 に答える