我决定使用代码制作一个calcutor,但我的程序不会工作。 当我输入我的操作数和新数字时,它似乎不会扫描操作数和数字,它不会启动循环。 谢谢你的帮助。
#include <stdio.h>
#include <math.h>
float add(float x,float y);
float sub(float x,float y);
float div(float x,float y);
float exp(float x,float y);
float mult(float x,float y);
int main(){
float y,x;
char op;
printf("Type in a number\n");
scanf("%f",&x);
printf("Type in your operand and desired number\n");
scanf("%c",&op);
scanf("%f",&y);
while (!(op=='q')){
if(op=='+'){
printf("Your result is %.1f\n",add(x,y));
scanf("%c",&op);
scanf("%f",&y);
}
else if(op=='-'){
printf("Your result is %.1f\n",sub(x,y));
scanf("%c",&op);
scanf("%f",&y);
}
else if(op=='*'){
printf("Your result is %.1f\n",mult(x,y));
scanf("%c",&op);
scanf("%f",&y);
}
else if(op=='/'){
printf("Your result is %.1f\n",div(x,y));
scanf("%c",&op);
scanf("%f",&y);
}
else if(op=='^'){
printf("Your result is %.1f\n",exp(x,y));
scanf("%c",&op);
scanf("%f",&y);
}
}
printf("Your final result is %.1f\n",x);
return(0);
}
float add(float x,float y){
return (x+y);
}
float sub(float x,float y){
return (x-y);
}
float div(float x,float y){
return (x/y);
}
float exp(float x,float y){
x=pow(x,y);
return(x);
}
float mult(float x,float y){
return (x*y);
}
答案 0 :(得分:1)
当你做
时scanf("%c",&op);
你读取输入缓冲区中的第一个字符。之前的scanf在其中留下了\n
个字符,因此您可以读取该字符。
你想要做的是摆脱scanf背后的所有东西。
while(getchar()!='\n')
continue;
在您尝试阅读之前,这将清空缓冲区。
这里每次使用scanf都会在缓冲区中留下新行字符,以便摆脱他,每次尝试从输入中读取字符时都使用上面的循环,并且你知道换行符就在那里。
答案 1 :(得分:1)
我认为正在发生的事情是在scanf("%f",&y);
调用之后输入流中保留了换行符( return / 输入键)什么被存储为scanf("%c",&op);
调用中的单个字符。
因此,您需要在此时丢弃换行符。最简单的方法是在需要读取单个字符时调用scanf("%c",&op);
两次。这适用于Mac和Unix。对于Windows,您可能需要读取字符三次,因为Windows通常将序列“\ r \ n”视为换行序列。
为了便于携带,你可以使用这样的循环:
do {
op = getchar();
} while (op == '\n' || op == '\r');
然后移除scanf("%c",&op);
。这个循环取而代之。
另一种选择是要求scanf
自己丢弃初始空格。
scanf(" %c",&op);
// ^ space
另外,请参阅我对this very similar question的回答。