1

嗨,我正在使用 while(true) 编写一个简单的计算器,它的工作原理是,当循环结束并再次开始时,它会重复第一行两次,有人有解决方案吗?提前致谢 ...

#include <stdio.h>
#include <stdlib.h>

int main()
{
char a,ch;
int x,y,i,n,e,s;
while(1) {
    printf("\nEnter the operation:");
    scanf("%c",&a);
    e=a;
    if (e=='+') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x+y;
        printf("\nThe result of %d+%d is:%d\n",x,y,s);
    } else {
        if (e=='-') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x-y;
        printf("\nThe result of %d-%d is:%d\n",x,y,s);
    } else {
        if (e=='*') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x*y;
        printf("\nThe result of %dx%d is:%d\n",x,y,s);
    } else {
        if (e=='/') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x/y;
        printf("\nThe result of %d/%d is:%d\n",x,y,s);
    } else {
        if (e=='%') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x%y;
        printf("\nThe result of %d%%d is:%d\n",x,y,s);
    } else {
        if (e=='^') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=pow(x,y);
        printf("\nThe result of %d^%d is:%d\n",x,y,s);
    }}}}}}
}}
4

4 回答 4

3

当您使用%cchar 输入时,输入流中会留下一个换行符。因此它不要求输入,因为输入流中留下的换行符被用于后续迭代。

在格式字符串中添加一个空格,以便 scanf() 忽略剩下的换行符(任何空白)字符。

改变:

scanf("%c",&a);

至:

scanf(" %c",&a);

这样 scanf() 将忽略所有空格。

于 2013-05-04T18:33:08.093 回答
1

当您使用 scanf() 读取键盘输入时,在按下 enter 后会读取输入,但 enter 键生成的换行符不会被调用 scanf() 消耗。这意味着下次您从标准输入读取时,将有一个换行符在等待您(这将使下一个 scanf() 调用立即返回而没有数据)。

为避免这种情况,您可以将代码修改为:

while(1) {
    printf("\nEnter the operation:");
    scanf("%c%*c", &a);
于 2013-05-04T18:35:22.100 回答
1

这应该是由于scanf。省略 scanf 并尝试使用 getchar() 接收操作命令。值得一试。

也可以使用 switch..case 来完成这类任务。包括“默认”子句也通知用户..

于 2013-05-04T18:45:12.530 回答
0

目前,如果您向循环提供任何您不期望的内容,它将再次执行,多次打印初始提示。这是一个对您的程序进行最小更改的解决方案,它只会在成功完成您处理的计算之一后重新打印初始提示:

#include <stdio.h>
#include <stdlib.h>

int main()
{
char a,ch;
int x,y,i,n,e,s;
int new_operation = 1;
while(1) {
    if (new_operation) {
        printf("\nEnter the operation:");
        new_operation = 0;
    }
    scanf("%c",&a);
    e=a;
    if (e=='+') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x+y;
        printf("\nThe result of %d+%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='-') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x-y;
        printf("\nThe result of %d-%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='*') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x*y;
        printf("\nThe result of %dx%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='/') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x/y;
        printf("\nThe result of %d/%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='%') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x%y;
        printf("\nThe result of %d%%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='^') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=pow(x,y);
        printf("\nThe result of %d^%d is:%d\n",x,y,s);
        new_operation = 1;
    }}}}}}
}}

请注意,更改包括新变量声明、初始提示周围的 if 语句,以及在每个操作完成后重置 new_operation 变量。

这将处理无关的换行符和对初始提示的任何其他未处理的响应。

于 2013-05-04T18:43:39.500 回答