2011-12-28 17 views
0

我对Objective C非常陌生,并且正在尝试编写一个程序来浏览collat​​z猜想。当我运行程序时,它会在第一次scanf后停止,并提供“EXC_BAD_ACCESS”。这是我的代码:目标C:为什么我会收到“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++; 
    } 
} 

我在做什么错在这里?

回答

1

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

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

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

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

以下应通过键入超过80个字符解决这些问题

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]; 
+0

它实际上仍然可以在这里崩溃。使用'scanf(“%80s”,inputBuffer);'会阻止这个。 – joerick 2011-12-28 16:30:32

相关问题