目标C:为什么我得到“EXC_BAD_ACCESS”?

时间:2011-12-28 16:13:52

标签: objective-c exc-bad-access

我是Objective C的新手,我正在尝试编写一个程序来完成collat​​z猜想。当我运行程序时,它会在第一次扫描后停止并出现“EXC_BAD_ACCESS”。这是我的代码:

int original,i;

NSString *PrintFull;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"Collatz Conjecture:");
    NSLog(@"Print full results?");
    scanf("%s",PrintFull);

    NSLog(@"What number should we go up to?");
    scanf("%d", &original);

    while (original <= 100) {
        NSLog(@"\n\n%d", original);
        i = original;
        while (i != 1) {
            if (i % 2) {
                i = (i*3)+1;
            } else {
                i = (i/2);
            }

            if ([PrintFull isEqualToString:@"yes"]) {
                NSLog(@"%d",i);
            }
        }

        original++;
    }
}

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

scanf不适用于NSString等对象类型。请参阅SO帖子 - Using scanf with NSStrings

答案 1 :(得分:2)

    格式字符串后的
  • scanf参数应指向已分配的对象。在这种情况下,您刚刚声明了一个指针并将其传递而没有设置它。 scanf将尝试写入此位置,但由于指针包含垃圾值,因此应用程序崩溃。

  • scanf来自C库'stdio.h',这意味着它不了解NSStrings,它来自Objective-C'Foundation'框架。

以下应解决这些问题

int original,i;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog(@"Collatz Conjecture:");

    NSLog(@"Print full results?");

    char inputBuffer[80];
    scanf("%s", inputBuffer);
    NSString *printFull = [NSString stringWithCString:inputBuffer encoding:NSUTF8Encoding];

答案 2 :(得分:1)

首先,您必须初始化并分配NSString。其次,scanf无法处理NSString

另请注意,类名以大写字母开头,类实例以小字母开头。