输入更多字符会跳过提示

时间:2014-09-24 14:19:27

标签: c input buffer stdin

我有一个缓冲区,我假设有10个字符。当我输入9个字符时我注意到它会跳过提示EX。

Enter a p value:
123456789
Enter a q value:
Enter a k value:

但如果我输入8或更少,即使用户输入字母或特殊字符,它也会正常接受,即使用户输入字母或特殊字符。

我的代码:

#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <ctype.h>
int main()
{
   char pbuffer[10], qbuffer[10], kbuffer[10];
   int p=0, q=0, k=0;
   int r, i, Q, c, count, sum;
   char a[3];
   a[0]='y';
   while(a[0]=='y' || a[0]=='Y')
   {
      printf("Enter a p value: \n");
      fgets(pbuffer, sizeof(pbuffer), stdin);
      p = strtol(pbuffer, (char **)NULL, 10);

      printf("Enter a q value: \n");
      fgets(qbuffer, sizeof(qbuffer), stdin);
      q = strtol(qbuffer, (char **)NULL, 10);

      printf("Enter a k value: \n");
      fgets(kbuffer, sizeof(kbuffer), stdin);
      k = strtol(kbuffer, (char **)NULL, 10);

      while(p<q+1)
      {
         Q=p;
         sum=0;
         count=0;
         while(Q>0)
         {
            count++;
            r = Q%10;
            sum = sum + pow(r,k);
            Q = Q/10;
         }

         if ( p == sum && i>1 && count==k )
         {
            printf("%d\n",p);

         }
         p++;
         a[0]='z';
      }
      while((a[0]!='y') && (a[0]!='Y') && (a[0]!='n') && (a[0]!='N'))
      {
         printf("Would you like to run again? (y/n) ");
         fgets(a, sizeof(a), stdin);
      }
   }
   return 0;
}

5 个答案:

答案 0 :(得分:3)

fgets将读取尽可能多的字符,直到它达到换行符,EOF或缓冲区的大小。它还为字符串终止\0保存了一个额外的字符。因此,如果您输入123456789\n并且有一个10个字符的缓冲区,fgets知道它只能容纳该缓冲区中的9个字符,所以它会读取前9个并附加一个NULL,缓冲区中123456789\0\n仍在STDIN中。然后,您再次拨打fgets。它不会等待输入,因为STDIN中已经有\n,因此它会读取\n,恰好只有一个字符。所以,你的第二个缓冲区现在是\n\0,而STDIN现在是空的。

使缓冲区足够大以存储您要输入的字符串,或者在每fgets之后刷新STDIN。可能像:

while((c = getchar()) != '\n' && c != EOF)
/* Ignore the character */                ;

答案 1 :(得分:0)

fgets

之后添加此行
  

的scanf( “\ n”);

答案 2 :(得分:0)

不是先读取char缓冲区,而是使用scanf(),例如scanf(&#34;%d&#34;,&amp; p)可以替换fgets()和strtol()。

答案 3 :(得分:0)

在使用

调用stdin之后,将fgets刷新
int c;
while((c = getchar()) != '\n' && c != EOF);

fgets等待用户输入数据的原因是因为fgets知道缓冲区已满(9个字符和\0的一个空格)并附加了字符串末尾的\0会将\n留在下一个stdin

所占用的fgets

答案 4 :(得分:0)

实际上,当提供给它的size参数小于输入的字符时,fgets会保留\ n字符。在您的情况下,您为fgets提供了10的大小值。

所以当你输入9个字符时,它会用它们填充缓冲区并等待你的输入停止阅读。当你按下输入时,它只是将空字符放在它的末尾,然后将输入转发到下一个提示,从而跳过它。

检查问题https://stackoverflow.com/a/11180652/1386897的答案中的示例。