C简介:添加和循环
我正在继续我对掌握C的探索,我目前正在做一个练习,让我的初级计算器不断提示我输入两个操作数和一个运算符。如果运算符不是“+”,则会显示错误消息。现在,我遇到了一些问题C简介:添加和循环,c,debugging,floating-point,calculator,addition,C,Debugging,Floating Point,Calculator,Addition,我正在继续我对掌握C的探索,我目前正在做一个练习,让我的初级计算器不断提示我输入两个操作数和一个运算符。如果运算符不是“+”,则会显示错误消息。现在,我遇到了一些问题 当我输入“+”时,它会显示两次。我在代码中找不到任何东西表明这会发生 第一个操作数也存在同样的问题。我也不知道如何告诉我的代码,我已经完成输入 第二个操作数很好,但我仍然不知道如何终止输入 在显示结果之后,它会正确地返回,但在再次提示之前会给我一条错误消息 注意:我知道您使用lf在scanf中读取双精度数字,但由于某些原因,lf
int main () {
char mychar;
int a;
double op1;
double op2;
printf("Welcome to Andrew Hu's calculator program!\n"); //Greeting
while(1)
{ printf("Enter a mathematical operation to perform:\n");
scanf("%c", &mychar);
if(mychar == '+') //Valid Operators
a = 1;
else
a = 0;
if(a == 0) //Operator Checker, error if invalid
printf("\nError, not a valid operator\n");
else if(a == 1){
printf("%c\n", mychar),
printf("Enter OP1:\n"),
scanf("%f", &op1),
printf("%f\n", op1),
printf("Enter OP2:\n"),
scanf("%f\n", &op2),
printf("%f\n", op2),
printf("Result of %f %c %f = %f\n",
op1, mychar, op2, (op1 + op2) );
}
}
这是一个典型的例子,您的老师/导师/书籍/在线教程/任何建议使用
scanf()
都是一个好主意,但事实并非如此。您也不应该对行尾做任何假设,作为最后一点,您应该更好地构造代码(包括大括号的格式和一致性)
我建议您不要使用poorscanf()
,它并不总是像您认为的那样,尤其是在有单个字符、字符串和换行符需要读取的情况下。相反,您最好阅读一行并对其进行分析和/或验证。如果你做得正确,它也会简单得多
我也不知道如何告诉我的代码,我已经完成输入
好吧,由你决定。请quit
操作员如何?例如:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char buf[0x100] = { 0 };
while (1) {
// If the user has entered "q", we enter the loop
fgets(buf, sizeof(buf), stdin);
if (buf[0] == 'q') break;
char *end;
float op1 = strtof(buf, &end); // parse 1st operand
while (isspace(*end)) {
end++;
}
char op = *end++; // get operator
float op2 = strtof(end, NULL); // parse 2nd operand
float r;
// do the calculation
switch (op) {
case '+':
r = op1 + op2;
break;
case '-':
r = op1 - op2;
break;
case '*':
r = op1 * op2;
break;
case '/':
r = op1 / op2;
break;
default:
fprintf(stderr, "Error: invalid operator '%c'\n", op);
continue;
break;
}
// print the result
printf("%f %c %f = %f\n", op1, op, op2, r);
}
return 0;
}
#包括
#包括
#包括
int main()
{
char buf[0x100]={0};
而(1){
//如果用户输入了“q”,我们就进入循环
fgets(buf、sizeof(buf)、stdin);
if(buf[0]=='q')中断;
字符*结束;
float op1=strtof(buf,&end);//解析第一个操作数
while(isspace(*end)){
end++;
}
char op=*end++;//get运算符
float op2=strof(end,NULL);//解析第二个操作数
浮子r;
//计算
开关(op){
格“+”:
r=op1+op2;
打破
案例'-':
r=op1-op2;
打破
案例“*”:
r=op1*op2;
打破
案例“/”:
r=op1/op2;
打破
违约:
fprintf(stderr,“错误:无效的运算符“%c”\n”,op);
继续;
打破
}
//打印结果
printf(“%f%c%f=%f\n”,op1,op,op2,r);
}
返回0;
}
首先,您需要在scanf中读取一个double,否则您只需读取一个float并将其存储在double的一半中
scanf("%lf", &op1),
printf不需要这样做,因为每个float参数首先被提升为double…对于初学者来说,它的
main()
{,而不是main{
。您可以尝试发布编译后的代码。感谢您的反馈,已编辑!当您阅读op2
时,您的格式字符串中有一个换行符;这不正确。请将其更改为阅读scanf(“%f”,&op2);
。谢谢!!这实际上解决了我所有的问题,但成功操作后收到的错误消息除外(见图)你没有向OP解释他的代码有什么问题。不过回答得很好+1@suspectus谢谢。我已经试过了……主要的问题是OP expectedscanf()
来做它不能做/不做的事情。@AndrewHu to OP:1.感谢您的接受,2.如果您需要更高的精度,您当然可以使用double
和strod()
。@H2CO3:注意,您可以通过在%c
转换说明符前面加一个空格,使其忽略前导空格:scanf(“%c”,&mychar);
@JohnBode是的,当然。这种输入的格式字符串可能类似于%f[]%c[]%f[^\n]
,但不确定这是否更容易阅读。:)
scanf("%lf", &op1),