#define f(x) (x*(x+1)*(2*x+1))/6
void terminate();
main()
{
int n,op;
char c;
printf("Enter n value\n");
scanf("%d",&n);
op=f(n);
printf("%d",op);
printf("want to enter another value: (y / n)?\n");
scanf("%c",&c); // execution stops here itself without taking input.
getch();
if(c=='y')
main();
else
terminate();
getch();
}
void terminate()
{
exit(1);
}
在上面的程序中,我想从用户那里获取输入,直到他输入n
值。
为此,我试图反复调用main()
函数。如果它在C中是合法的,我想知道为什么程序终止于scanf("%c",&c)
,如注释行所示。
有人,请帮帮忙。
答案 0 :(得分:5)
永远不要在程序中调用main
。如果你需要再运行一次,那么在其中使用while
循环。
您的执行会停止,因为默认情况下,终端中的stdin是行缓冲的。您也没有使用getch
的返回值。
int main()
{
int n,op;
char c;
do {
printf("Enter n value\n");
scanf("%d",&n);
op=f(n);
printf("%d",op);
printf("want to enter another value: (y / n)?\n");
scanf("%c",&c);
} while (c == 'y')
return 0;
}
答案 1 :(得分:3)
你首先有
scanf("%d",&n);
您必须按 Enter 键才能接受该号码。
稍后你有
scanf("%c",&c);
这里存在一个问题,即第一次调用scanf
会在输入缓冲区中留下 Enter 键。因此,后来的scanf
调用将会读取该内容。
通过稍微更改第二个scanf
调用的格式字符串,可以轻松解决这个问题:
scanf(" %c",&c);
/* ^ */
/* | */
/* Note space here */
这告诉scanf
函数跳过前导空格,其中包括 Enter 键离开的新行。
答案 2 :(得分:1)
这是合法的,但一段时间后你会有一个STACKOVERFLOW(双关语)。 你需要的是一个循环:
while (1) {
printf("Enter n value\n");
scanf("%d",&n);
op=f(n);
printf("%d",op);
printf("want to enter another value: (y / n)?\n");
scanf("%c",&c); // execution stops here itself without taking input.
getch();
if(c != 'y')
break;;
}