我编写的代码将操作计为+
,-
,*
,/
,阶乘等。问题是我的代码一次有效。它显示:
Zadajte operaciu
这意味着“写下你想做的事”。但是在第一次循环结束后。它显示:
Zadajte operaciu:Zadajte operaciu:
两次,我不知道为什么。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,vysledok;
char s;
do{
printf("Zadajte operaciu:");
s=getchar();
if(s=='+' || s== '-' ||s== '*' || s=='/' ||s== '^')
{
puts("Operacia je binarna.\nZadaj prvy operand: ");
scanf("%d",&a);
puts("Zadaj druhy operand: ");
scanf("%d",&b);
switch (s){
case '+':
printf("Vysledok je %d.\n",a+b);
break;
case '-':
printf("Vysledok je %d.\n",a-b);
break;
case '/':
if(b==0)
puts("CHYBA: nulou sa delit neda.\n");
else
printf("Vysledok je %d.\n",a/b);
break;
case '*':
printf("Vysledok je %d.\n",a*b);
break;
case '^':
for(a;a>0;a--)
b=b*b;
printf("Vysledok je %d.\n",b);
break;
}}
else if(s== '!' || s=='s')
{
puts("Operacia je unarna.\nZadaj prvy argument: ");
scanf("%d",&a);
switch (s){
case '!':
vysledok=a;
for(a;a>0;a--)
vysledok=vysledok*a;
printf("Vysledok je %d.\n",vysledok);
break;
case 's':
vysledok=sqrt(a);
printf("Vysledok je %f.\n",(float)vysledok);
break;
}}
else if(s=='q')
puts("Zadany prikaz quit. Ukoncujem.");
} while (s!='q');
return 0;
}
答案 0 :(得分:1)
输入值后,按enter键(\n
)。此字符保留在stdin
中。在第二次迭代中,getchar
获取\n
字符,因为它不符合if
之后的条件,if
的正文不会被执行,当while
中的条件为真时,下一次迭代开始,因此打印两次。
要删除该字符,您需要clear your stdin
答案 1 :(得分:1)
在s = getchar();
之前使用函数getch()getch();
s=getchar();
可能会帮助您或您可以使用
scanf(" %c",&s);
而不是s = getchar();
不要忘记在%c之前放置空格答案 2 :(得分:0)
每次调用getchar后都需要清空缓冲区,如下所示:
s = getchar();
while((s = getchar()) != EOF & s != '\n');
而非单独:
s = getchar();