我正在尝试用C语言编写一个计算器程序。
输入必须完全采用以下形式:
a oper b
其中a,b是double和oper类型的数字是这些字符+, - ,*,/。
代码:
int main()
{
char oper;
double a, b;
printf("What do you want to calculate?\n");
if (scanf("%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
printf("Error. Invalid input.\n");
else {
switch(oper)
{
case '+':
printf("%f+%f=%.2f",a,b,a+b);
break;
case '-':
printf("%f-%f=%.2f",a,b,a-b);
break;
case '*':
printf("%f*%f=%.2f",a,b,a*b);
break;
case '/':
if(b != 0)
{
printf("%f/%f=%.2f",a,b,a/b);
break;
}
else
{
printf("Error! You can not divide by 0.");
break;
}
default:
printf("Error! Invalid operator.");
break;
}}
return 0;
}
问题:
当用户输入例如此输入时:
123
程序将冻结。
同时,当用户输入例如这些输入时:
123 5
123 ab
Hello
我们的程序将打印
ERROR. Invalid input.
我真的需要你的帮助。如果我们输入这个输入,请你修改我的代码,例如:
123
我们的程序将打印
ERROR. Invalid input.
Thaks
答案 0 :(得分:3)
从fgets
开始:
char buffer[256];
printf("What do you want to calculate?\n");
fgets(buffer, 256, stdin);
if (sscanf(buffer, "%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
printf("Error. Invalid input.\n");
// .. rest of the code
答案 1 :(得分:3)
您的程序在输入123
上“冻结”,因为当用户按Enter键时,scanf
未完成读取;它期待操作员和其他操作数跟随。您可以在后续行中输入这些内容。这是因为scanf
格式化程序中的任何空格都可以代表输入中任何数量和类型的空格,即123\n+\n\t 456
有效并产生与输入123+456
相同的结果。
我建议一次用fgets
一行读取一行到缓冲区中,然后从那里解析它,例如sscanf
。如果你只想坚持scanf
,可以使格式不允许换行分隔符,但是必须在运算符和操作数之间有空格:
if (scanf("%lf%*[ \t]%1[-+/*]%*[ \t]%lf", &a, &oper, &b) != 3)
编辑:另外,正如@chux所指出的,将%1[-+/*]
的结果存储在char oper
中是不正确的,因为%[]
格式化程序会生成一个字符串,这意味着终止NUL角色必须有空间。将类型更改为char oper[2]
或将格式更改为%c
。
答案 2 :(得分:1)
在我的测试中,当你输入“123”时程序没有被冻结,它只是等待下一行的更多输入。如果你想强制它从一行获取所有输入,最简单的方法是我知道如何将字符串读入内存,然后使用sscanf()扫描字符串。
所以程序的顶部看起来像这样:
int main()
{
char line[100] ;
char oper[4];
double a, b;
printf("What do you want to calculate?\n");
if ( ! fgets(line, sizeof(line), stdin))
{ printf("No input.\n") ; exit( 1) ; }
if (sscanf(line, "%lf %1[-+/*] %lf\n", &a, &oper, &b) != 3)
printf("Error. Invalid input.\n");
else {
switch (* oper) {
此外,您可能希望在输出后添加换行符。
答案 3 :(得分:0)
#include<Stdio.h>
int main()
{
double a,b;
char operator;
puts("Please enter your two operands");
printf("operand no 1 = ");
scanf("%f",&a);
printf("operand no 2 = ");
scanf("%f",&b);
puts("Now choose what do you want to calculate");
printf("+ - * / which one : ");
scanf("%c",operator);
if(operator=='+')
printf("ans = %f ",a+b);
else if(operator=='-')
printf("ans = %f ",a-b);
elseif(operator=='*')
printf("ans = %f ",a*b);
else if(operator=='/')
printf("ans = %f ",a/b);
puts("thank you !");
return 0;
}