【发布时间】:2014-09-23 14:49:26
【问题描述】:
基本上在每个 printf 之前的 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;
}
【问题讨论】:
-
@PaulR,你是我相信错了。符合这些功能是非标准的,不可移植。 fpurge() 函数是在 4.4BSD 中引入的,在 Linux 下不可用。函数 __fpurge() 是在 Solaris 中引入的,并且存在于 glibc 2.1.95 及更高版本中。 linux.die.net/man/3/fpurge
-
将
a定义为char您的输入是错误 (scanf(" %s", &a);):它将尝试在内存中至少写入'\0'字符a所在位置之后的位置。那个记忆位置不属于你。 -
@Satya:你可能是对的 - 我会删除我的评论。
-
请注意
fflush的这种行为并没有得到广泛支持,并且与“flush”的通常含义不兼容。真的没有标准的、可移植的方法来清除输入流而不读取它。 -
顺便说一句:
pow(r,k);可能是个问题。很多关于那个的帖子。使用类似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; }
标签: c input buffer stdin fflush