【问题标题】:scanf char variable in between scanf integer variable doesn't work? [duplicate]scanf 整数变量之间的 scanf char 变量不起作用? [复制]
【发布时间】:2013-12-08 12:22:01
【问题描述】:

我想制作一个计算器,只是一个简单的带有循环和基本操作的计算器,但奇怪的是我的 scanf 数字之间的字符 scanf 被忽略了。如果我把它放在整数的scanf 上面,它工作得很好,但它看起来不像计算器。有没有办法解决这个问题?它还没有完成;到这里有一个错误,所以想知道哪里出了问题。

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

int main(){
    int number1,number2,total;
    char a;
    printf("This is your personal calculator:(End with ""="")\n");

    scanf("%d",&number1);
    scanf("%c",&a);
    scanf("%d",&number2);

    if (a == 'x' || a == 'X' || a == '*'){
        total=number1*number2;
        printf("%d",total);
    } else if (a == '/'){
        total=number1/number2;
        printf("%d",total);
    } else if (a == '+'){
        total=number1+number2;
        printf("%d",total);
    } else if (a == '-'){
        total=number1-number2;
        printf("%d",total);
    } else {
        printf("error");
    }

    system("pause");
    return 0;
}

【问题讨论】:

  • 您必须展示您输入号码的方式。如果您在一行中输入所有内容(如12+34),我相信您的计算器会正常工作。但是,如果您在单独的行中输入所有内容,那就是另一回事了。您必须在问题中包含如此重要的细节。
  • 也不清楚你为什么告诉用户“以 =”结尾。用户应该在何处、何时以及如何输入“=”?

标签: c char int scanf


【解决方案1】:

您应该测试您是否每次都从scanf() 获得值。

%c 字符读取第一个数字后的空格或换行符;使用" %c" 和前导空格来跳过可选的空格,然后再读取字符。

if (scanf("%d", &number1) == 1 &&
    scanf(" %c", &a) == 1 &&
    scanf("%d", &number2) == 1)
{
    ...process possibly valid input...
}
else
{
    ...diagnostics...
}

如果您使用fgets() 阅读整行并使用sscanf() 解析它们,可能会更容易提供良好的诊断。

  • 建议 1:显示一个示例,说明您输入的内容和输出的内容。这使人们更容易为您提供帮助(他们可以判断程序是否为他们生成相同的输出)。
  • 建议 2:回显您的输入,这样您就可以看到程序得到了什么。这使您可以判断程序是否获得了您期望的输入。例如,您可能会发现 number2 没有包含您所期望的内容。
  • 建议 3:将number1number2 初始化为-1,这样您就可以看到scanf() 何时失败(因为您还没有检查scanf() 是否成功)。

【讨论】:

    【解决方案2】:

    问题是因为scanf留下的换行符char\n。这可以通过在格式说明符%c 之前放置一个空格来避免。

    试试这个

    scanf(" %c", &a);  
           ^ An space  
    

    这将帮助你吃掉第一个 scanf 留下的 \n char

    【讨论】:

    • 嗨,谢谢它解决了这个问题.. 直到现在才知道谢谢
    • 欢迎您。我很高兴它对你有所帮助:)
    【解决方案3】:
    int main()
    
    {
    
    int number1,number2,total;
    char a;
    printf("This is your personal calculator:(End with ""="")\n");
    
    scanf("%d",&number1);
    
    fflush(stdin); // SIMPLE WAY FLUSH THE INPUT STREAM, INPUT BUFFER IS USUALLY CLEARED.
    scanf("%c",&a);
    
    scanf("%d",&number2);
    
    if (a == 'x' || a == 'X' || a == '*'){
        total=number1*number2;
        printf("%d",total);
    } else if (a == '/'){
        total=number1/number2;
        printf("%d",total);
    } else if (a == '+'){
        total=number1+number2;
        printf("%d",total);
    } else if (a == '-'){
        total=number1-number2;
        printf("%d",total);
    } else {
        printf("error");
    }
    
    system("pause");
    return 0;
    

    }

    【讨论】:

    • 申请fflushstdin是违法的。 fflush 仅适用于 output 流。所以,它不仅不是“简单的冲洗方法”,实际上是一个重大错误。
    • @AndreyT:请注意,在某些系统上,fflush(stdin) 已定义,特别是在 Windows 和 Linux 上(请参阅Using fflush(stdin)),但也在其他一些基于 Unix 的系统上。它不是根据 C 标准或 POSIX 定义的行为,但系统确实定义了它。
    猜你喜欢
    • 2012-07-10
    • 2020-06-28
    • 2014-10-04
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多