0
#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);
}

此循环在第一次迭代后结束,无需从键盘输入。

4

3 回答 3

3

fflush与输出流相关联。不要叫它stdin

那是因为在您输入之后Y,输入流中仍然有一个换行符,该换行符作为下一个输入传递给getc. 所以现在,循环的条件现在失败并退出循环。

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

请注意,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);
}
于 2012-09-21T16:54:25.763 回答
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
   }
}
于 2012-09-21T17:21:13.640 回答
1

问题是,当您从用户(来自键盘的标准输入)获得输入时,您获得的不仅仅是一个Y字符,而是两个字符:Y\n.

您必须使用\n或存储一个 char 数组并将其从您的输入中删除,或者类似的东西。这是一个快速的单行修复程序,它不会真正改变您的代码:

n=getc(stdin); 
getchar(); //consume the newline
于 2012-09-21T17:26:48.910 回答