【发布时间】:2015-11-13 07:34:15
【问题描述】:
首先,我只想说这是来自书中的一个练习。这是一个非常简单的计算器。该练习特别说明了使用 goto 语句来完成这项工作(循环回到开头以输入另一个表达式)。我和本书的作者都知道 goto 语句通常不是一个好主意。我写了这个小程序,但我不知道为什么我不能让它工作。
#include <stdio.h>
int main(void)
{
double num1 = 0.0; // first operand value a decimal number
double num2 = 0.0; // second operand value a decimal number
char oper = 0; // operator - must be +, -, *, /, or %
char again = 0;
// get the expression from the user
Start: printf("\n\nEnter the expression: ");
scanf("%lf %c %lf", &num1, &oper, &num2);
switch(oper)
{
case '+': // no checks necessary for addition
printf(" = %lf\n\n", num1+num2);
break;
case '-': // no checks necessary for subtraction
printf(" = %lf\n\n", num1-num2);
break;
case '*': // no checks necessary for multiplication
printf(" = %lf\n\n", num1*num2);
break;
case '/':
if(num2 == 0) // check second operand to see if it's zero
printf("\n\n\aError: division by zero!\n\n");
else
printf(" = %lf\n", num1/num2);
break;
case '%':
if((long)num2 == 0) // check second operand to see if it's zero
printf("\n\n\aError: division by zero!\n\n");
else
printf(" = %ld\n", (long)num1%(long)num2);
break;
default: // if we get here, it's an illegal operation
printf("\n\n\aIllegal operation!\n\n");
break;
}
printf("Do you want to perform another calculation? Y/N: ");
scanf("%c", &again);
if((again == 'Y') || (again == 'y'))
{
printf("\n");
goto Start;
}
return 0;
}
第一个 printf() 和 scanf() 对工作正常。但是,底部的对不起作用(在 switch 语句下方)。它将 printf() 函数中的文本打印到屏幕上,然后程序结束(我正在使用命令行运行它)。它不允许我输入“Y”以使其循环回到开头。如果我剪下这两行代码并将它们粘贴到顶部,程序会暂停并等待我的响应(它会让我输入响应)。我已经来回移动了几次线条,但我根本无法弄清楚为什么它在一个地方有效,而在另一个地方无效。
附:我不想使用 goto 语句,但这让我很恼火,因为我无法弄清楚为什么我不能从书中得到这个例子。任何帮助,将不胜感激。谢谢。
【问题讨论】:
-
你确定不是
scanf失败了吗?您是否尝试在scanf调用之后直接转储变量的值? -
或者简单地说,检查
scanf()的返回值? -
这看起来好像字符扫描在原始输入之后重新调整了换行符。
scanf(" %c")在格式说明符前加一个空格可以解决您的问题。 (在我看来,更好的解决方案是使用双字符输入策略:先用fgets读取一行,然后用sscanf扫描。) -
我 100% 确定是 scanf() 失败了。 printf() 工作正常。出于某种原因,它只是跳过了 scanf() - 即不等待我输入响应。如果我将这两行移到顶部,它会暂停并允许我输入响应。它唯一不起作用的地方是我应该拥有它的地方......在底部。
-
scanf("%c", &again);-->scanf(" %c", &again);
标签: c