Ваша проблема может быть связана с рядом проблем с буферизацией, таких как scanf()
номера, но не со следующими переводами строки.Кроме того, я иногда нахожу, что NSLog()
беспорядок буферизации stdin / stdout, если вы также используете printf()
или scanf()
.Обычно я считаю, что лучше по возможности избегать функции scanf()
, особенно когда используется язык более высокого уровня, такой как Objective-C.
Вместо использования scanf()
для чтения пользовательского ввода, я написал небольшую функциюпрочитать строку из консоли и вернуть ее как NSString
.Эта функция выглядит следующим образом:
NSString * readLine (FILE * input) {
NSMutableString * string = [[NSMutableString alloc] init];
int aChar = 0;
while ((aChar = fgetc(input)) != EOF) {
if (aChar != '\r') {
if (aChar == '\n') {
break;
} else if (aChar > 0) {
[string appendFormat:@"%C", aChar];
}
}
}
return [string autorelease];
}
Используя эту функцию, вы можете переписать вашу функцию main()
, используя этот новый метод.В следующем коде я также убрал все операторы NSLog()
, которые запрашивают у пользователя информацию, заменив их более подходящими printf()
вызовами.
int main (int argc, char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
double payRate, hours, totalPay;
NSString * name;
NSString * amount;
NSNumberFormatter * price = [[NSNumberFormatter alloc] init];
[price setNumberStyle:NSNumberFormatterCurrencyStyle];
[price setCurrencySymbol:@"$"];
while (YES) {
printf("Please, enter your name: ");
name = readLine(stdin);
if ([name isEqualToString:@"DONE"])
break;
else {
printf("Enter the total number of hours: ");
hours = [readLine(stdin) intValue];
printf("Enter the pay rate: ");
payRate = [readLine(stdin) intValue];
if (hours <= 40)
totalPay = hours * payRate;
else
totalPay = 400 + (payRate * (hours - 40) * 1.5);
NSNumber * myNumber = [NSNumber numberWithDouble:totalPay];
amount = [price stringFromNumber:myNumber];
NSLog(@"Name: %@", name);
NSLog(@"Hours: %.2lf", hours);
NSLog(@"Pay Rate: %.2lf",payRate);
NSLog(@"Total Pay: %@", amount);
}
}
[price release];
NSLog(@"DONE!");
[pool drain];
}