2010-10-19 54 views
2

我在Java和.Net中编写了一段时间,但从未真正使用C或Objective C.我仍试图理解一些概念。我正在研究一个简单的程序,以了解如何创建一系列结构。我相信我是对的。我很难弄清楚如何访问子类并将值存储到我创建的子类中。不知道为什么我有“EXC Bad Access”错误

我猜我得到的错误,因为我使用scanf。任何人都可以提供帮助吗?

这是我到目前为止。

#import <Foundation/Foundation.h> 

//Player Prototype: Stores name and wins so far. It can also print out the name and wins 
@interface Player : NSObject 
{ 
    NSString *name; //Player name 
    NSInteger wins; //Player wins 
    NSInteger losses; //Player losses 
    NSInteger bp; //extra value for anything I might need in the future. 
} 

@property (retain, nonatomic) NSString *name; 
@property NSInteger wins; 
@property NSInteger losses; 
@property NSInteger bp; 

@end 

//Next part 

@implementation Player 

@synthesize name; 
@synthesize wins; 
@synthesize losses; 
@synthesize bp; 

@end 

//Brackets 

@interface Bracket : NSObject 
{ 
    NSMutableArray *playerarray; 
    Player *addplayer; 
} 

@property (retain, nonatomic) NSMutableArray *playerarray;//array of players 
@property (retain, nonatomic) Player *addplayer;//player and data 

-(void) SetUp; 

@end 

//Starting Bracket, working with only 8. Later moving up to 32 
@implementation Bracket 

@synthesize playerarray; 
@synthesize addplayer; 

-(void) SetUp;//sets up the array 
{ 
    int i;//counting fun! 
    playerarray = [[NSMutableArray alloc] init];//initialize a bracket 
    for(i = 0; i < 8; i++)//To add the players 
    { 

     Player *addplayerx = [Player new];//New instance of Player 

     NSString *p;//Not sure if I need two of them. 
     NSString *tempname = @"bye"; 

     NSLog(@"Player %d Name:", i); 
     scanf("%s",&p); 
     tempname = p; 
     NSLog(@"%s", tempname); 
     addplayerx.name = p; 
     NSLog(@"%s", addplayerx.name); 
     addplayerx.wins = 0; 
     addplayerx.losses = 0; 
     addplayerx.bp = 0; 
     [playerarray addObject: addplayerx]; 
     [addplayerx release]; 
     [p release]; 

    } 
} 


@end 



//End function 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Bracket *starting = [Bracket new]; 
    [starting SetUp]; 

    [pool drain]; 
    return 0; 
} 

回答

4

您不能将scanf()转换为NSString。你需要扫描到一个普通的C字符串(确保你为它分配内存),然后你可以使用stringWithUTF8String:或其他东西来构建NSString

+0

谢谢!这为我解决了这个问题。我仍然习惯它,但是由于你的建议,我已经取得了很大的进步。 – Duckzero 2010-10-20 00:19:38

2

不要猜测:在调试器下运行应用程序,当它崩溃时,检查回溯。您还可以查看〜/ Library/Logs/DiagnosticReports/foo.crash中的回溯。

你想做什么,从文件中逐行读取数据?这将是很容易只使用text = [NSString stringWithContentsOfFile:path]再拆对所有换行符text

NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet]; 
NSArray *lines = [text componentsSeparatedByCharactersInSet:newlines]; 

然后,您可以对面和循环抢球员的名字:

NSMutableArray *players = [NSMutableArray arrayWithCapacity:[lines count]]; 
NSString *whitespace = [NSCharacterSet whitespaceCharacterSet]; 
for (NSString *line in lines) { 
    NSString *name = [line stringByTrimmingCharactersInSet:whitespace]; 
    Player *player = [[[Player alloc] init] autorelease]; 
    player.name = name; 
    [players addObject:player]; 
} 
+0

我打算在后面添加阅读文件的功能。我目前只是试图添加命令行中的值来实践。我现在正在尝试打印播放器对象数组,并获取存储位置的地址。这并不能帮助我太多,因为我想知道名字等等。 :( – Duckzero 2010-10-20 00:22:09

+0

没关系,我只是想出了如何摆脱地址,并取而代之的价值。 – Duckzero 2010-10-20 00:28:35