gpt4 book ai didi

c - fgets() 和 Ctrl+D,三遍结束?

转载 作者:行者123 更新时间:2023-12-04 18:27:57 26 4
gpt4 key购买 nike

我不明白为什么我需要按 Ctrl+D 三次才能发送 EOF。

此外,如果我按 Enter 键,则只需 Ctrl+D 即可发送 EOF。

我怎样才能做出改变,只需要一个 Ctrl+D 就可以检测到 EOF?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF_SIZE 1024

int main(){
char buffer[BUF_SIZE];
size_t msgLength = 1;
char *msg = malloc(sizeof(char) * BUF_SIZE);

msg[0] = '\0';
printf("Message: ");
while (fgets(buffer, BUF_SIZE, stdin)){
char *old = msg;
msgLength += strlen(buffer);
msg = realloc(msg, msgLength);

strcat(msg, buffer);
}
return 0;
}

最佳答案

您遇到的问题是终端没有 EOF - 它们不是文件,因此“文件结尾”实际上没有任何意义。相反,它们有 EOT(传输结束 - Ctrl+D),由于(快乐?)事故,它通常注册为 stdio 的 EOF。

UNIX 上的文件通过返回大小为 0 的读取来发出 EOF 信号,并且 stdio 将任何大小为 0 的读取视为 EOF,无论它是否正在从文件中读取。 EOT 导致终端立即返回,当且仅当输入缓冲区为空时,这将是一个大小为 0 的读取(触发 stdio 中的 EOF)。

最简单的解决方案是不用担心——如果用户想在此处发出 EOF 信号,只需让用户多次按 Ctrl+D 即可。它应该只需要两个,除非您遇到奇怪的时间问题。

如果你真的想要,你可以尝试确定是否命中了 EOT——如果 fgets 的结果没有填充缓冲区并且没有以换行符结尾,那么用户点击 EOT 来传输它,所以你可以测试为此并跳出循环。如果用户输入了足够的数据来填充 fgets 缓冲区然后点击 EOT,则此操作将失败。如果用户“键入”速度太快而程序无法跟上,它也可能会失败(程序实际上并未等待输入时的 EOT 无效)。我说“打字”是因为终端可能是一个伪终端,在另一端有一些伪造非常快速的输入(包括 EOT)

关于c - fgets() 和 Ctrl+D,三遍结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43001734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com