使用fflush(stdin)和flushstdin()有什么区别?我所知道的唯一不同之处是,在使用flushstdin()之前,我需要写一些空洞的东西,但我不知道为什么。
void flushstdin()
{
int c;
while((c = getchar()) != '\n' && c != EOF);
}
int main () {
float a, b, c;
float s=0, ar1=0, ar2=0;
printf("Inform value of side A");
while(scanf("%f",&a) != 1 || a <= 0){
printf("Invalid value.\n");
flushstdin();
}
}和
int main(){
float a,b,c,s=0;
printf("Inform value of side A.");
while(scanf("%f",&a) != 1 || a<=0){
printf("Invalid value.\n");
fflush(stdin);
}
}我是初学者!哪种代码是最好的?还是他们是平等的?
发布于 2015-06-05 21:07:32
这两个版本都有问题。
正如广泛记录的那样,fflush(stdin)根据C标准有未定义的行为。使用flushstdin()函数的替代方法也不是很好。我建议一次只读取一行标准输入,然后用sscanf()解析它,所有这些都是可以根据需要使用的实用函数:
int readfloat(const char *prompt, float *val) {
char buf[128];
for (;;) {
if (prompt)
fputs(prompt, stdout);
if (!fgets(buf, sizeof(buf), stdin)) {
printf("Premature end of file\n");
return 1;
}
if (sscanf(buf, "%f", val) == 1 && *val > 0)
return 0;
printf("Invalid value.\n");
}
}
int main(void) {
float a, b, c, s = 0;
if (readfloat("Enter value of side A: ", &a))
return 1;
...
}发布于 2015-06-05 20:15:30
不同的是,flushstdin是用户定义的,是标准C中刷新stdin的唯一方法。
fflush是一个标准的库函数。fflush(stdin);将调用未定义的行为。
c-常见问题:12.26 a:
fflush仅为输出流定义。由于它对“刷新”的定义是完成缓冲字符的写入(而不是丢弃它们),因此对于输入流上的fflush来说,丢弃未读输入并不是一个类似的意思。
C-常见问题: 12.26b:
没有从stdio输入流中丢弃未读字符的标准方法。有些厂商确实实现了
fflushfflush(stdin),这样fflush(stdin)就可以丢弃未读字符,尽管可移植程序不能依赖于这个。(stdio库的某些版本实现了fpurge或fabort调用,它们做同样的事情,但它们也不是标准的。)还要注意的是,刷新stdio输入缓冲区并不一定足够:未读字符也可以在其他OS级输入缓冲区中积累。如果您试图主动放弃输入(可能是因为预期会发出意外提示来确认破坏性操作,而意外键入的"y“可能是灾难性的),您将不得不使用特定于系统的技术来检测类型化输入的存在;请参见问题19.1和19.2。请记住,如果您丢弃了输入速度过快的输入,用户可能会感到沮丧。
https://stackoverflow.com/questions/30675045
复制相似问题