为什么我的程序循环没有接收任何新输入?

时间:2013-02-21 02:59:21

标签: c scanf

我试图让我的程序在给出答案后重新开始。一旦我运行一次,它就不会再次运行了。我希望它能够使用户无需再次启动程序。谢谢!

#include <stdio.h>
#include <math.h>


int main()
{
    float firstnum, secondnum, answer;
    char function;

    printf("\nHello and welcome to my calculator!\n");                                             //Intro

    start:                                                                                         //Area to loop to when program completes

    printf("\nPlease input the function you would like to use.  These include +, -, *, /.\n");     //Asking for function input

    scanf("%c", &function);                                                                        //Receiving Function Input

    printf("\nNow please input the two variables.\n");                                             //Asking for variables

    scanf("%f", &firstnum);

    scanf("%f", &secondnum);                                                                       //Receiving Input for Variables

    if (function == '+')                                                                           //Doing calculation
    {
            answer = firstnum+secondnum;
    }
    else if (function == '-')
    {
    answer = firstnum-secondnum;
    }
    else if (function == '*')
    {
    answer = firstnum*secondnum;
    }
    else if (function == '/')
    {
    answer = firstnum/secondnum;
    }
    else
    {
            printf("Sorry that was an incorrect function.  The correct inputs are +, -, *, /.");       //If they don't follow the directions
    }

    printf("Your answer is %f \n", answer);                                                        //Answer

    goto start;                                                                                    //Loop

return 0;

}

3 个答案:

答案 0 :(得分:2)

这是[enter]键。您的第一个scanf正在读取您按下的回车键以终止上一次迭代。

因此,您需要在scanf("%c", &function);之前添加另一个getchar();goto来换取换行符。

在阅读数字时,scanf将占用任何初始空格;但是在阅读角色时,它不会。它为您提供了流中的下一个字节。


<德尔> 也许更好的方法是告诉`scanf`在哪里期待所有新行。这样你就不需要*奇怪的神秘线,它似乎没有做任何事情,但没有评论(!);因为当你几个月后再玩这个代码时会引起问题。
//scanf("%c\n", &function); /* read a character followed by newline DOESN'T WORK */
...
//scanf("%f\n", &secondnum); /* read a number followed by newline DOESN'T WORK */

<德尔> 这样,消耗了尾随换行符。我认为,这是更直观的行为(来自用户方面)。 不。不行。希望它能做到,因为我看起来不那么愚蠢。


我并不为goto感到沮丧。很高兴见到一位老朋友。如果有的话,这是适当的使用。它完全等同于while形式。因此,您当然应该注意大多数人更愿意看到while(1)因为它会告诉您更多关于正在发生的事情而不是label:。但是对于小于屏幕的函数的无限循环,为什么不呢?玩得开心。没有婴儿海豹会受到伤害。 :)

答案 1 :(得分:1)

这就是你使用循环的原因。 (并尝试不使用goto)。

#include <stdio.h>
#include <math.h>


int main() {

    float firstnum, secondnum, answer;
    char function, buffer[2];

    while(1) {      

        printf("\nHello and welcome to my calculator!\n");                                             

        printf("\nPlease input the function you would like to use.  These include +, -, *, /.\n");     
        scanf("%s", &buffer);   
        function = buffer[0];
        printf("\nNow please input the two variables.\n");  
        scanf("%f", &firstnum);
        scanf("%f", &secondnum);
        if (function == '+') answer = firstnum+secondnum;
        else if (function == '-') answer = firstnum-secondnum;
        else if (function == '*') answer = firstnum*secondnum;
        else if (function == '/') answer = firstnum/secondnum;
        else printf("Sorry that was an incorrect function.  The correct inputs are +, -, *, /.");    

        printf("Your answer is %f \n", answer);                                                               
        } 

     return 0;
     }

这应该是一个无限循环,所以使用用户输入break;循环来退出程序


注意:我已经用%s替换了scanf%c,表示输入了一个字符串&amp;使用缓冲区。

 scanf("%s",&buffer); function = buffer[0];

(根据评论中的讨论更新)

答案 2 :(得分:0)

关于scanf的一个“最佳实践”是检查它的返回值。关于scanf的返回值,我建议您仔细阅读this scanf manual并回答以下问题:

  1. int x = scanf(“%d”,&amp; foo);如果我输入“fubar \ n”作为输入,你认为x是什么?
  2. 你认为“fubar \ n”中的'f'会在哪里发生?
  3. 如果它仍然在stdin中,你会期待第二次扫描(“%d”,&amp; foo);要成功吗?
  4. int x = scanf(“%d”,&amp; foo);如果我在Windows上运行此代码并按CTRL + Z将EOF发送到stdin,您认为x是什么?
  5. 如果x小于1,使用foo会安全吗?为什么不呢?
  6. int x = scanf(“%d%d”,&amp; foo,&amp; bar);如果我输入“123 456 \ n”作为输入,你会期望x是什么?
  7. 你认为'\ n'仍然会在stdin上吗? char_variable在scanf(“%c”,&amp; char_variable)之后保持什么值;?
  8. EOF可以通过CTRL + Z在Windows中通过stdin发送,在CTRL + D中通过Linux和朋友发送,除了使用管道和重定向来重定向来自其他程序和文件的输入。

    通过使用int function; for (function = getchar(); function >= 0 && isspace(function); function = getchar()); assert(function >= 0);char function; assert(scanf("%*[ \n]%c", &function) == 1);之类的代码,您可以在分配到函数之前丢弃前导空格。