c - 输入更多字符会跳过提示

标签 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;
}

最佳答案

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 */                ;

关于c - 输入更多字符会跳过提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019289/

相关文章:

c - 可以转换为在 C 运行时确定的给定类型的指针吗?

c - 这个打印订单有什么问题

html - 输入和按钮内联

go - 如何在 Go 中有效地处理大型数据数组(超过 10MiB)?

c - Arduino WaveHC 收集文件名

数据指针和函数指针的指针大小可以不同吗?

javascript - mvc - 输入时提交文本输入字段

python - 根据用户输入终止包含 while 循环的多个进程

java - PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

python - 尽管语法正确,但 Memoryview 中的切片分配会引发 ValueError