Ошибка EXC_BAD_ACCESS, вопрос Objective-C

Эй, я новичок в Objective-C, а также в программировании с Cocoa вообще... в любом случае мой код выглядит так:

int main(int argc, char *argv[])
{
printf("how many address would you like to input?\n");
int numAddresses;
scanf("%i", &numAddresses);
char *inputString;

NSMutableArray * arrayOfBooks = [NSMutableArray array];
for (int i = 0; i < numAddresses; ++i) {
 book * f = [[book alloc] init];


 printf("Please input the name of contact %i\n", i+1);
 scanf("%s",inputString);
 [f setName: inputString];

 printf("Please input the address of contact %i\n", i+1);
 scanf("%s", inputString);
 [f setAddress: inputString];

 printf("Please input the birthday of contact %i\n", i+1);
 scanf("%s", inputString);
 [f setBirthday: inputString];

 printf("Please input the phone number of contact %i\n", i+1);
 scanf("%s", inputString);
 [f setPhoneNumber: inputString];

 [f print]; 

 [arrayOfBooks addObject:f];
 [f release];
 }

for(int i = 0; i < numAddresses; i++){
 [arrayOfBooks[i] print];

}

return 0;
 }

Я просто делаю адресную книгу. Когда я ввожу имя, он выдает ошибку «EXC_BAD_ACCESS». Почему?

#import "book.h"


@implementation book

-(void) setName: (char*) nameInput{
name = nameInput;

 }

-(void) setAddress: (char*) addressInput{
address = addressInput;

}

-(void) setPhoneNumber: (char*) phoneNumberInput{
phoneNumber = phoneNumberInput;
}

-(void) setBirthday: (char*) birthdayInput{
birthday = birthdayInput;
}

-(void) print{
printf("Name: %s\n", name);
printf("Address: %s\n", address);
printf("Phone Number: %s\n", phoneNumber);
printf("Birthday: %s\n", birthday);
 }

@end

РЕДАКТИРОВАТЬ: я больше не получаю ошибку... но теперь у меня новая проблема. Он предлагает мне ввести имя, а затем мгновенно предлагает мне ввести адрес, прежде чем я смогу что-либо сделать. Почему это могло происходить?


person Community    schedule 10.11.2010    source источник
comment
Не связано с вашей ошибкой EXC_BAD_ACCESS, но если вы действительно хотите создать приложение адресной книги, вам, вероятно, следует использовать структуру AddressBook.   -  person Alex Martini    schedule 11.11.2010
comment
Кроме того, вы всегда должны проверять возвращаемое значение scanf. scanf возвращает количество элементов, которые были успешно проанализированы, поэтому в вашем коде каждый вызов scanf должен возвращать 1. Если он не возвращает 1, это означает, что произошла ошибка.   -  person dreamlax    schedule 11.11.2010


Ответы (2)


Рекомендуется использовать fgets() вместо scanf(). Любые пробелы (пробелы, табуляции, символы новой строки и т. д.) заставят scanf() прекратить синтаксический анализ, что на основе входных данных, которые вы пытаетесь получить, вероятно, не то, что вам нужно.

Используйте fgets() следующим образом:

char lineBuffer[100]; // or some number large enough

puts("Enter something:");
if (fgets(lineBuffer, sizeof lineBuffer, stdin))
{
    // lineBuffer contains the input, but it also contains the '\n' at the end.
    doSomething(lineBuffer);
    // etc. etc.
}
person dreamlax    schedule 10.11.2010

"inputstring" - это просто char * - он не назначен и не имеет связанного с ним хранилища.

Вы должны передать ему указатель на массив достаточного размера, использовать модификатор "a" и передать указатель на указатель на символ, который scanf выделяет для ты.

См. справочную страницу на странице scanf http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/scanf.3.html

person Brad    schedule 10.11.2010
comment
Хорошо, это имеет большой смысл... но это просто подводит меня к новой проблеме, которая у меня возникла. После того, как я ввел имя/адрес/и т.д. он устанавливает их, но все они каким-то образом устанавливаются на то, что я ввел последним. - person ; 11.11.2010
comment
Вы перечитываете данные в один и тот же буфер, а ваши подпрограммы установки просто указывают их все на один и тот же буфер. Вам необходимо скопировать данные в уникальные NSStrings. - person Brad; 11.11.2010