从C中的用户输入重复循环

时间:2012-09-21 16:52:39

标签: c gcc

#include <stdio.h>

int main()
{
        char n='Y';
        fflush(stdin);
        while(n=='Y')
        {
                printf("Add Next Y/N: ");
                n=getc(stdin);
        }
        printf("n = %c",n);
}

此循环在第一次迭代后结束而不从键盘输入。

3 个答案:

答案 0 :(得分:3)

fflush与输出流相关联。不要在stdin上调用它。

这是因为在输入Y之后,输入流中仍然会留下换行符,该换行符将作为getc的下一个输入传递。所以现在,循环的条件现在失败并且循环出来。

只需在getc()之后添加getchar()即可使用换行符。

请注意,getchar()getc(stdin,ch)相同。

#include <stdio.h>

int main()
{
        char n='Y';

        while(n=='Y')
        {
                printf("Add Next Y/N: ");
                n=getc(stdin);
                getchar();
        }
        printf("n = %c",n);
}

答案 1 :(得分:2)

在我的系统上,getc()似乎没有返回,直到我点击返回键。这意味着'Y'后面跟着'\ n'。所以为了保持循环,我不得不为while添加一个条件:

#include <stdio.h>
#include <ctype.h>
int main()
{
   char n = 'Y';
   while ( toupper(n) == 'Y' || n == '\n'  )
   {
      if ( n != '\n' )
      {
         printf("Add Next Y/N: ");
      }
      n = getc(stdin);
   }
}

fgets()似乎效果更好:

#include <stdio.h>
#include <ctype.h>
int main()
{
   char input[100] = { "Y" };
   while ( toupper(input[0]) == 'Y' )
   {
      printf("Add Next Y/N: ");
      fgets(input,sizeof(input),stdin);
   }
}

编辑以下评论: scanf()也有回车问题。最好是fgets()然后是sscanf()。因为你正在做额外的getchar()我认为你可以摆脱'\ n'的检查。试试这个:

#include <stdio.h>
#include <ctype.h>

struct item {
      char name[100];
      int avg;
      double cost;
};


int main()
{

   FILE *fp = fopen("getc.txt","w");
   struct item e;
   char line[200];
   char next = 'Y';
   while(toupper(next) == 'Y') 
   { 
      printf("Model name, Average, Price: "); 
      fgets(line,sizeof(line),stdin);
      sscanf(line,"%s %d %f",e.name,&e.avg,&e.cost); 
      fwrite(&e,sizeof(e),1,fp); 
      printf("Add Next (Y/N): "); 
      next = getc(stdin);
      getchar(); // to get rid of the carriage return
   }
   fclose(fp);
}

没有sscanf()的替代方法:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

struct item {
      char name[100];
      int avg;
      double cost;
};
int main() 
{
   struct item e;
   char line[200];
   char next = 'Y';
   while(toupper(next) == 'Y') 
   { 
      printf("Model name ");
      fgets(line,sizeof(line),stdin);
      line[ strlen(line) - 1 ] = '\0'; // get rid of '\n'
      strcpy(e.name,line);
      printf("\nAverage "); 
      fgets(line,sizeof(line),stdin);
      e.avg = atoi(line);
      printf("\nPrice "); 
      fgets(line,sizeof(line),stdin);
      e.cost = atof(line);
      printf("you input %s %d %f\n",e.name,e.avg,e.cost);
      printf("Add Next (Y/N): "); 
      next = getc(stdin);
      getchar(); // get rid of carriage return
   }
}

答案 2 :(得分:1)

问题在于,当您从用户那里获得输入(键盘中的标准输入)时,您不仅仅获得Y字符,而是获得两个字符:Y\n

您必须使用\n或存储char数组并从输入中删除它,或者沿着这些行删除它。这里有一个快速的一行修复,并没有真正改变你的代码:

n=getc(stdin); 
getchar(); //consume the newline