2010-08-11 89 views
0

我有一个程序,其中dreamlax与我一起工作了很多,它使用Objective-C将温度转换成华氏温度,摄氏温度,开尔文温度和朗肯温度,但转换控制台输入开尔文,然后从开尔文到最终用户所需的温度范围。objective-c字符串,字符串格式化程序

现在,我有一个想法,一旦计算完成,我想实现转换温度的最终提示。它是目前设置为仅显示像这样:

X温度规模

,其中X =最终转换后的温度,和温度标度=规模的用户希望他的温度转换成。

假设最终用户选择华氏温度作为他/她的源温度,希望将212度转换为他/她的目标温度标度摄氏温度。该转换应等于100摄氏度很明显,但我认为该方案会显示这样的结果更好:

度华氏摄氏度。

现在,我已经制作了需要由粗体变量替换的值。我有212和100的值很容易解决,因为100变量已经在那里了,212可以通过替换sourceTemp变量的字符串格式化程序(包含用户原始输入温度的变量)很容易地得到补救。

现在,华氏字符串有点不同。

我试图建立一些新的东西在原来的交换机,像这样:

switch (prompt) 
{ 
    case 1: 
     //end-user chooses Fahrenheit 
     [converter setFahrenheitValue:sourceTemp]; 
     sourceTempText = 1; 
     break; 

    case 2: 
     //end-user chooses Celsius 
     [converter setCelsiusValue:sourceTemp]; 
     sourceTempText = 2; 
     break; 

    case 3: 
     //end-user chooses Kelvin 
     [converter setKelvinValue:sourceTemp]; 
     sourceTempText = 3; 
     break; 

    case 4: 
     //end-user chooses Rankine 
     [converter setRankineValue:sourceTemp]; 
     sourceTempText = 4; 
     break; 
} 

好了,我已经加入到每一个不同的情况下,设定一个名为sourceTempText要么1-4新的变量,同最终用户选择他/她的源温度的值。

现在,这里是我如何试图显示最终提示最终用户与最终​​的开关:现在

switch (prompt2) 
{ 
    case 1: 
     //end-user chooses Fahrenheit 
     printf("%lf degrees sourceTempText is %lf degrees Fahrenheit\n", sourceTemp, [converter fahrenheitValue]); 
     break; 

    case 2: 
     //end-user chooses Celsius 
     printf("%lf degrees sourceTempText is %lf degrees Celsius\n", sourceTemp, [converter celsiusValue]); 
     break; 

    case 3: 
     //end-user chooses Kelvin 
     printf("%lf degrees sourceTempText is %lf degrees Kelvin\n", sourceTemp, [converter kelvinValue]); 
     break; 

    case 4: 
     //end-user chooses Rankine 
     printf("%lf degrees sourceTempText is %lf degrees Rankine\n", sourceTemp, [converter rankineValue]); 
     break; 
} 

我不知道,如果我可以插入sourceTempText到字符串像我有在这里,相反,也许我必须使用字符串格式化程序,但我不确定。这应该是一个简单的解决方法,我只是想把它扔出来! :)

P.S.对于那种凌乱的问题格式抱歉,我有点不知道怎么说,所以如果需要的话请索取澄清。

回答

2

替换为%s sourceTempText,和上面的switch声明声明可能的字符串,像这样:

char *scales[4] = { "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

然后像这样添加和参数给每个printf,在sourceTemp,后:

printf("%lf degrees %s is %lf degrees Fahrenheit\n", 
        sourceTemp, scales[prompt-1], [converter fahrenheitValue]); 

这是prompt-1,因为计数从零开始,并且从1开始。


ps。我现在看到你设置了sourceTempText = 1/2/3/4; - 我刚刚使用prompt,因为它具有相同的值。你可以做什么,是设置

char *scales[5] = { "Error!", "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

,并使用scales[sourceTempText],同时确保前switchsourceTempText = 0。这将是一个很好的输入消毒示例:无论用户在prompt中输入什么内容,程序都会显示有效的文本。

+0

哇,这很好!但是,只有几个问题,char *尺度究竟是什么?[4]?这是什么意思,我明白你的逻辑,给它可能的字符串肯定。另外,我猜%s是字符串的字符串格式化程序? – Qcom 2010-08-11 01:08:01

+1

是的,%s是用于字符串的(不是NSString,但这是另一个话题)。 'char * scales [4] = {}'说:有4个char *类型的指针。一个'char *'指针就是你在这里称之为“string”的地方;它指向字符串开始的内存,它是一个内存地址。通过说'鳞[0]'你实际上说:给我第一个(“第零”)指针在那里。然后%s在内存中查找该位置。为了进行实验,可以尝试用'scales [prompt-1] + 1'替换'scales [prompt-1]',这将使字符串从第二个字符打印出来。 (“ahrenheit”,“elsius”,“elvin”和“ankine”) – mvds 2010-08-11 01:14:13

+0

太好了,再次感谢!现在,在您的更新中,您提到了我的sourceTempText。只有一件我感到困惑的事情是,由于case 1-4,提示=与sourceTempText相同吗?现在,如果sourceTemptText = 0,我应该显示什么?用户甚至可能会发生这种情况?哦,我应该指出,我的代码实际上通过设置结果变量= scanf来处理不正确的输入。如果scanf返回0,则出现错误,如果它返回EOF,则会出现另一个错误。我不确定这是否与您提出的相同。 – Qcom 2010-08-11 01:18:27