2

我正在努力使我的程序在给出答案后重新开始。一旦我运行它一次,它就不会再次运行。我想让它在用户不必再次启动程序的地方发挥作用。谢谢!

#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;

}

4

3 回答 3

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:. 但是对于比屏幕小的函数中的无限循环,为什么不呢?玩得开心。没有婴儿海豹会受到伤害。:)

于 2013-02-21T03:03:46.933 回答
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;循环来退出程序


注意:我已将 scanf %c 替换为 %s ,表示输入字符串并使用缓冲区。

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

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

于 2013-02-21T03:11:39.877 回答
0

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

  1. int x = scanf("%d", &foo); 如果我输入“fubar\n”作为输入,你认为 x 会是什么?
  2. 你认为“fubar\n”中的“f”会去哪里?
  3. 如果它保留在标准输入中,你会期待第二个 scanf("%d", &foo); 要成功?
  4. int x = scanf("%d", &foo); 如果我在 Windows 上运行此代码并按 CTRL+Z 将 EOF 发送到标准输入,您认为 x 会是什么?
  5. 如果 x 小于 1,使用 foo 是否安全?为什么不?
  6. int x = scanf("%d %d", &foo, &bar); 如果我输入“123 456\n”作为输入,您期望 x 是什么?
  7. 你认为 '\n' 仍然会在标准输入上吗?scanf("%c", &char_variable); 之后 char_variable 会保持什么值?

除了使用管道和重定向来重定向来自其他程序和文件的输入之外,EOF 在 Windows 中可以通过 CTRL+Z 发送,在 Linux 和朋友中可以通过 CTRL+D 发送。

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

于 2013-02-21T04:09:26.703 回答