我试图让我的程序在给出答案后重新开始。一旦我运行一次,它就不会再次运行了。我希望它能够使用户无需再次启动程序。谢谢!
#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;
}
答案 0 :(得分:2)
这是[enter]键。您的第一个scanf
正在读取您按下的回车键以终止上一次迭代。
因此,您需要在scanf("%c", &function);
之前添加另一个getchar();
或goto
来换取换行符。
在阅读数字时,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并回答以下问题:
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);
之类的代码,您可以在分配到函数之前丢弃前导空格。