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文字を取得するのではなく、次の 2 つの文字を取得することですY\n

\nchar 配列を消費するか格納して、入力から削除するか、それらの行に沿って何かを削除する必要があります。これは、コードを実際に変更しない簡単な 1 行の修正です。

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