C: Clearing STDIN

grundsätzlich in codeblocks für windows vor jedem printf, ich habe "fflush(stdin);" funktioniert. Wenn ich kopiert mein code zu Linux, es funktioniert nicht, auch nicht eine der alternativen für die "fflush(stdin);", die ich gefunden habe. Egal wie ich scheinen, es zu tun, der Eingang scheint nicht zu klären, die in den Puffer oder so etwas in meinem code falsch ist.

#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;
}
  • Sie werden, glaube ich Irrt. Gemäß Diesen Funktionen werden nicht standardisierte und nicht tragbar. Die Funktion fpurge() wurde in 4.4 BSD und nicht unter Linux verfügbar sind. Die Funktion __fpurge() wurde eingeführt, Solaris, und ist in glibc 2.1.95 und später. linux.die.net/man/3/fpurge
  • Mit a definiert als eine char Ihre Eingabe ist FALSCH (scanf(" %s", &a);): es wird versuchen zu schreiben, zumindest die '\0' Charakter in der memory-position nach, wo a liegt. Dass der Speicher position nicht zu dir gehören.
  • Sie mögen Recht haben - ich werde Sie löschen meinen Kommentar.
  • Bitte beachten Sie, dass dieses Verhalten von fflush ist nicht, die allgemein unterstützt und nicht wirklich kompatibel mit der üblichen Bedeutung von "flush". Es gibt wirklich keinen standard, tragbare Weg zum löschen der Eingabe-Datenstrom, ohne zu Lesen von ihm.
  • BTW: pow(r,k); ist wahrscheinlich ein problem. Viele Beiträge SO auf, dass man. Verwenden Sie so etwas wie unsigned powuu(unsigned x, unsigned y) { unsigned z = 1u; unsigned base = x; while (y) { if (y & 1u) { z *= base; } y >>= 1u; base *= base; } return z; }
InformationsquelleAutor Andrew Ricci | 2014-09-23
Schreibe einen Kommentar