我是Objective C的新手,我正在尝试编写一个程序来完成collatz猜想。当我运行程序时,它会在第一次扫描后停止并出现“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++;
}
}
我在这里做错了什么?
答案 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
。
另请注意,类名以大写字母开头,类实例以小字母开头。