2011-12-28 18 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

相關問題