我正在Objective-C中编写一个简单的控制台应用程序,但我听说这个编码可能会松散地应用于某些C,所以我想说清楚。
我遇到了一个小问题,但是当我从Xcode中的调试器运行时,出于某种原因,我的程序不会等待用户输入,它只是直接滚动,显示字符串并自动转换数字。 / p>
有这种情况吗?
我是否在if else语句中没有指明正确的内容?
这是我的代码:
//Simple program to convert Fahrenheit to Celsius and Celsius to Fahrenheit
#import <stdio.h>
@interface Converter: NSObject
{
//Instance variable which stores converting formula for objects
double formula;
}
//Declare instance method for setting instance variable
-(double) convert: (double) expression;
//Declare instance method for getting instance variable
-(double) formula;
@end
@implementation Converter;
//Define instance method to set the argument (expression) equal to the instance variable
-(double) convert: (double) expression
{
formula = expression;
}
//Define instance method for returning instance variable, formula
-(double) formula
{
return formula;
}
@end
int main (int argc, char *argv[])
{
//Point two new objects, one for the Fahrenheit conversions and the other for the Celsius conversions, to the Converter class
Converter *fahrenheitConversion = [[Converter alloc] init];
Converter *celsiusConversion = [[Converter alloc] init];
//Declare two double variables holding the user-inputted data, and one integer variable for the if else statement
double fahrenheit, celsius;
int prompt;
NSLog(@"Please press 0 to convert Celsius to Fahrenheit, or 1 to convert Fahrenheit to Celsius\n ");
scanf("%i", &prompt);
if(prompt == 0) {
NSLog(@"Please enter a temperature in Celsius to be converted into Fahrenheit!:\n");
scanf("%lf", &celsius);
[fahrenheitConversion convert: ((celsius*(9/5)) + 32)];
NSLog(@"%lf degrees Celsius is %lf Fahrenheit", celsius, [fahrenheitConversion formula]);
}
else {
NSLog(@"Please enter a temperature in Fahrenheit to be converted into Celsius!:\n");
[celsiusConversion convert: ((fahrenheit - 32)*(5/9))];
NSLog(@"%lf degrees Fahrenheit is %lf Celsius", fahrenheit, [celsiusConversion formula]);
}
return 0;
}
更新
看起来Xcode调试器中的控制台没有等待我输入的原因是因为我把它设置为iPhone应用程序,而不是Mac OS X Cocoa,我甚至不记得为什么我这样做了。我真正应该做的只是制作一个没有模板的项目,所以它没有任何期待......
我仍然非常感激并乐于接受像dreamlax这样的建议,而我正在尝试实施你的代码建议,但它比预期的要困难一些,因为我还是很新。
答案 0 :(得分:2)
当您致电scanf
时,请务必检查返回值。然而,它将返回成功扫描的许多项目。在您的应用程序中,您只提供一个参数,因此如果scanf
成功,那么它应该返回1.它可以返回另外两个值:
scanf
可能会返回EOF
。scanf
可能会返回0(如果用户提供了字母字符而不是数字,或者如果用户只是按下输入而没有输入任何内容,则可能会发生这种情况,等)您应该检查每个scanf
来电的结果并妥善处理。
int result = scanf("%i", &prompt);
if (result == EOF || result == 0)
{
NSLog (@"There was an error reading your choice.");
exit(1);
}
else
{
// result should be 1 here, continue onwards doing work
}
为什么scanf
在运行调试器时可能无法返回1,这可能有很多原因,这里有一些我能想到的:
stdin
已关闭,因此从stdin
阅读将始终失败。stdin
流中。我不确定这可能来自哪里。如果仅使用一个刻度将温度保存在班级中可能会更好。例如:
@interface Temperature : NSObject
{
double celsius; // only store one temperature
}
- (id) initWithFahrenheit:(double) f;
- (id) initWithCelsius:(double) c;
- (double) fahrenheitValue;
- (double) celsiusValue;
@end
@implementation Temperature
- (id) initWithFahrenheit:(double) f
{
self = [super init];
if (!self) return nil;
celsius = (f - 32)*(5/9);
return self;
}
- (id) initWithCelsius:(double) c
{
self = [super init];
if (!self) return nil;
celsius = c;
return self;
}
- (double) fahrenheitValue
{
return (celsius*(9/5)) + 32);
}
- (double) celsiusValue
{
return celsius;
}
@end
然后,如果你有一个fahrenheight值,你可以这样做:
Temperature *myTemp = [[Temperature alloc] initWithFahrenheit:f];
double celsius = [myTemp celsiusValue];
看看你是否也可以实施其他温标,例如Kelvin和Rankine!
答案 1 :(得分:0)
您应该在scanf的格式中使用"%d"
而不是"%i"
:
scanf("%d", &prompt);