在C中调用main函数

时间:2014-02-21 17:23:34

标签: c main

#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),如注释行所示。 有人,请帮帮忙。

3 个答案:

答案 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;;
}