2015-09-20 82 views
0

虽然我可以确认我正在输入正确类型的输入到我的C程序中,但我无法正确解释它的条件。当我运行以下代码时,程序成功调用lengthFormula(),然后打印"Choose from the following..."输入提示。C程序条件无法识别可操作的输入

int main(void) 
{ 
    char newCalculation; 

    do 
    { 
     char newCalculation; 

     lengthFormula(); 

     printf("\nChoose from the following:\n a.) Calculate the length of a multi-bar scene in this project\n b.) Calculate bar length for a NEW project\n c.) Exit\n\n"); 
     scanf(" %c", &newCalculation); 

     /* printf("%c", newCalculation); */ 

    }while(tolower(newCalculation) == 'b'); 

    if(tolower(newCalculation) == 'a') 
    { 
     float barLength; 
     multiBar(barLength); 
    } 

    if(tolower(newCalculation) == 'c') 
    { 
     exitProgram(); 
    } 
    return 0; 
} 

当我进入a,而不是再次调用lengthFormula()main()回报0和程序终止。当我取消注释第二个printf()调用并再次编译/运行时,输入a返回a,但它仍然返回0 /程序终止,而不是调用lengthFormula()

在@simplicisveritatis的建议,我也试着将我的条件语句,像这样的主要do-while循环中,具有相同的结果:

int main(void) 
{ 
char newCalculation; 

do 
{ 
    char newCalculation; 

    lengthFormula(); 

    printf("\nChoose from the following:\n a.) Calculate the length of a multi-bar scene in this project\n b.) Calculate bar length for a NEW project\n c.) Exit\n\n"); 
    scanf(" %c", &newCalculation); 

    /* printf("%c", newCalculation); */ 
if(tolower(newCalculation) == 'a') 
    { 
     float barLength; 
     multiBar(barLength); 
    } 

    if(tolower(newCalculation) == 'c') 
    { 
     exitProgram(); 
    } 

}while(tolower(newCalculation) == 'b'); 



return 0; 
} 

我如何改变我的条件,使他们识别我的输入?请不要告诉我使用getchar(),因为每次我这样做,其他人都会告诉我使用scanf(),其他人说这是危险的。我只是想了解为什么我的条件不起作用。

+0

为什么他们告诉你使用'scanf()'?,请任何理由。你是否包含'stdio.h'和'ctype.h'?而这个“浮动杠” multiBar(barLength);'是未定义的行为,因为你永远不会初始化'barLength'。 –

+0

我们知道,有关于如何从用户获得输入的章节。人们鄙视scanf,但其他人使用它也一样。一些人坚持cin >> v,其他人则警告说“这会给你一个字符串”......但是,您的scanf函数在上下文中是暂时的。 – JVene

+0

'cin >> v'与这个问题无关,因为这是[tag:c]而不是[tag:C++],并且是'scanf()'是可怕的。特别是因为它没有正确地在书本中出现,他们通常忽略它的返回价值。 –

回答

1

您将在循环内重新声明newCalculation。用过的那个循环与你不一样的是scanf() ed。

事实上,dowhile循环外,newCalculation甚至没有初始化,所以当你把它传递给tolower()它可以具有任何价值,这是不可能知道哪一个原则。

取出声明内循环,

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 
    char newCalculation; 
    do 
    { 
     lengthFormula(); 

     printf("\nChoose from the following:\n a.) Calculate the length of a multi-bar scene in this project\n b.) Calculate bar length for a NEW project\n c.) Exit\n\n"); 
     scanf(" %c", &newCalculation); 

     /* printf("%c", newCalculation); */ 

    } while(tolower(newCalculation) == 'b'); 

    if (tolower(newCalculation) == 'a') 
    { 
     float barLength = 0.0F /* please initialize this before calling the function */; 
     /* Or just multiBar(0.0F) */ 
     multiBar(barLength); 
    } 

    if (tolower(newCalculation) == 'c') 
    { 
     exitProgram(); 
    } 
    return 0; 
} 
+0

当我从循环中删除声明,然后编译/构建,我得到错误 'newCalculation'未声明(首次在此函数中使用) 它已经在循环中声明,我可以在哪里声明它? 我也尝试过在全局声明'newCalculation',虽然编译时没有问题,但它将我带回到最初的运行时问题。 –

+0

不,在'do {...'之前的第一个声明就够了。除了scanf()失败以外,您不需要其他任何东西。无论如何,这种情况不太可能发生。 –

0

好了,让我们开始字符newCalculation。在你的示例中,一次在do循环之外声明一次,一次在do循环之内声明它。这意味着你有两个,while循环内部的一个不被while测试识别,这意味着tolower(newCalculation)不是“看到”你输入的字母,它看到了在循环外部声明的未初始化newCalculation中的垃圾。删除内部的一个。

此外,在声明它的位置将其初始化为零。

你表明你有一个习惯,不用初始化你再次使用float barLength;来表示float barLength(0);或类似的东西。

也就是说,您对'a'的测试确实需要调整长度。但是,除非剪切事故堆栈在外部新计算中留下'b'或'B',否则循环不会重复。你真正打算在这里停止一个'c'程序...这意味着你不需要函数exitProgram,只需要将这个while测试改为类似于:

while(tolower(newCalculation) != 'c');