c - 否定 !my_function() 如何影响我在 C 中的函数?

标签 c buffer eof flush negation

这是我的 read_double 函数。为什么我必须检查 !flush_buff() 或者它的作用是什么?我不知何故无法弄清楚。我不能只写 flush_buff() 然后返回 DBL_MIN 吗?

double read_double(void) {
     double x;
     int c, status;

    printf("Insert double: ");
    status = scanf("%lf", &x);
    if (status == EOF || (c = getchar()) == EOF) {
        return DBL_MIN;
    }
    if (status != 1 || c != '\n' || x < DBL_MIN) {
        if (!flush_buff()) { /*What is the purpose of this?*/
            return DBL_MIN;
        }
        return DBL_MAX;
    }
    return x;
}

flush_buff 函数:

int flush_buff(void) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {}
    return c != EOF;
}

最佳答案

flush_buff() 函数从 stdin 获取字符,直到遇到换行符 (\n) 或文件结尾 (EOF ).如果它发现一个换行符(而不是 EOF),那么它返回一个“真”值(等于 1)。

语法 !flush_buff() 否定此返回值,因此如果 flush_buff() 在换行处停止,则为假(零),或为真(1 ) 如果已到达文件末尾。

在您发布的代码中,如果成功读取浮点值,则 status 的值为 1,如果无法成功读取浮点值,则为 0,或者 EOF 如果输入流在没有提供任何输入的情况下结束。

如果status 不是EOF,则从输入中读取一个附加字符c。如果这不是换行符,或者如果提供的数字超出正非零 float 的范围,则输入被视为无效。

此时,程序员已经决定——无论出于何种原因——如果输入文件在当前行结束,函数应该返回 DBL_MIN,如果当前行以换行符终止。这背后的原因尚不清楚。

关于c - 否定 !my_function() 如何影响我在 C 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953030/

相关文章:

c - 从输出中排除用户的输入值

c - 如何在 SDL 中创建颜色渐变

C 将char数组(字符串)UTF8格式转换为CP1252(ASCII)格式

size - 我如何提前知道 nanopb 中的缓冲区大小是否足够?

log4net - 有没有办法以编程方式刷新 log4net 中的缓冲区

c - 如何读取文件 C,fscanf 结尾

objective-c - 在简单的 perl 或简单的 unix 中分解 JSON 字符串?

c++ - 如何设置 lua.dll 以便 lua.exe 不会在每个目录中都要求它?

java - 为什么我得到 java.io.EOFException?

c - 检测不完整的 32 位二进制数据