当前位置: 首页 > 知识库问答 >
问题:

C:结算标准

戚飞雨
2023-03-14

基本上,在每次打印之前,在windows的代码块中我有“fflush(stdin);”这很有效。当我将代码复制到Linux时,它不起作用,“fflush(stdin);”的任何替代方案也不起作用我找到了。无论我用哪种方式做,输入在缓冲区中似乎没有被清除,或者我的代码中的某些内容不正确。

#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, 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;
}

共有3个答案

宗政永望
2023-03-14

不再需要刷新输入缓冲区。

OP在正确的轨道上使用fget()而不是scanf()进行输入,OP应该继续这种方法:

char a;
while(a !='y' && a !='Y' && a!='n' && a!='N' ) {

  printf("Would you like to run again? (y/n) \n");
  if (fgets(kbuffer, sizeof(kbuffer), stdin) == NULL) 
    Handle_EOForIOerror();

  int cnt = sscanf(kbuffer, " %c", &a); // Use %c, not %s
  if (cnt == 0) 
    continue; // Only white-space entered
  }

最好不要使用scanf()。

当前OP的某些烦恼源于fgets()scanf(“%s”)之后,

通过仅对用户IO使用fgets(),消除了刷新的需要。

示例fgets()wrapper

char *prompt_fgets(const char *prompt, char dest, long size) {
  fputs(prompt, stdout);
  char *retval = fgets(dest, size, stdin);
  if (retval != NULL) {
    size_t len = strlen(dest);
    if (len > 1 && dest[len-1] == '\n') { // Consume trailing \n
      dest[--len] = '\0';
    }
    else if (len + 1 == dest) {  // Consume extra char
      int ch;
      do {
        ch == fgetc(stdin);
      } while (ch != '\n' && ch != EOF);
    }
  return retval;
  }  

姜永贞
2023-03-14

我认为你想做的事情比看起来要困难得多。

我对你所要做的解释是禁用提前键入,这样如果用户在你的程序处理其他东西时键入一些字符,它们就不会出现在提示符上。这实际上很难做到,因为它是操作系统级别的函数。

在打印提示之前,您可以在设备上执行非阻塞读取,直到在errno中获得ewoldblock。或者TceTattr函数系列可能会有所帮助。看起来有一种方法可以排出其中的文件描述符的输入,但它可能与fgets/fscanf交互不好

一个更好的办法是根本不用担心。Unix用户习惯于提前输入,您想要的是他们的意外行为。

马凡
2023-03-14

调用fflush(stdin)不是标准的,因此行为是未定义的(有关更多信息,请参阅此答案)。

您可以调用scanf,传递一个格式字符串,指示函数读取所有内容,包括换行符,如下所示:

scanf("%*[^\n]%1*[\n]");

星号告诉scanf忽略结果。

另一个问题是调用scanf将字符读入变量a,格式说明符为“%s”:当用户输入非空字符串时,null终止符会造成缓冲区溢出,导致未定义的行为(char a是一个一个字符的缓冲区;string“y”有两个字符-{'y','\0'},第二个字符写在缓冲区的末尾)。您应该将a更改为具有多个字符的缓冲区,并将该限制传递给scanf

char a[2];
do {
    printf("Would you like to run again? (y/n) \n")
    scanf("%1s", a);
} while(a[0] !='y' && a[0] !='Y' && a[0]!='n' && a[0]!='N' );
}
 类似资料:
  • C++ 重载运算符和重载函数 下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能。 下面的实例演示了如何重载下标运算符 []。 #include <iostream> using namespace std; const int SIZE = 10; class safearay { private: int arr[SIZE]; pu

  • 本文向大家介绍C#常用数据结构和算法总结,包括了C#常用数据结构和算法总结的使用技巧和注意事项,需要的朋友参考一下 1.数据   数据(Data)是外部世界信息的载体, 是能够被计算机识别,加工,存储的。在现实生活中也就是我们的产品原材料。   计算机中的数据包括数值数据,图片,影音资料等. 2. 数据元素和数据项   数据元素(Data Element)是数据的基本单位,在计算机处理的过程中通常

  • 本文向大家介绍C#常见算法面试题小结,包括了C#常见算法面试题小结的使用技巧和注意事项,需要的朋友参考一下 本文实例汇总了C#面试常见的算法题及其解答。具有不错的学习借鉴价值。分享给大家供大家参考。具体如下: 1.写出冒泡,选择,插入排序算法。 2.有一列数1,1,2,3,5,........求第30个数. 3. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。 4.有一个字符串 "I

  • 问题内容: 为了解决这个问题,我使用x和y的不确定性进行拟合,使用scipy curve_fit进行正确拟合,包括x中的错误? 拟合之后,我想计算参数的不确定性。因此,我看一下协方差矩阵对角元素的平方根。我得到: 但是根据odr的文档,在其中也有 形状(p,)的估计参数的标准误差。 但是,它不会给我相同的结果: 编辑 这是笔记本上的示例:https : //nbviewer.jupyter.org

  • 指针运算符加减标签操作 指针作为一种特殊的变量,它的运算和普通变量是有一定区别的。指针在运算中并没有具备其它变量所有的性能。我们只是给大家介绍一些指针常用的运算: 加法运算(+,++) 我们知道一个整型的变量可以为它做加法运算,那么指针变量加1之后是一个地址还是一个整型? int *p=xxx; [0x12] //有一个int类型的指针,它的指针变量存储的地址为0x12。 p=p+1; 由于p是

  • C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。 面向对象类库: 这个库是类及其相关函数的集合。 C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。 标准函数库 标准函数库分为以下几类: 输入/输出 I/O 字符串和字符处理 数学 时间、日期和本地化 动态分配 其他 宽字符函数 面向对象类库 标