gpt4 book ai didi

c - C 语言的读写

转载 作者:行者123 更新时间:2023-11-30 21:33:02 26 4
gpt4 key购买 nike

所以我用以下代码搞乱了读取函数 fgets 和 scanf 以及打印函数 write 和 printf:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
printf("Enter an integer: ");
int n = 0; scanf("%d",&n);
printf("The input number is: %d\n", n);
printf("Please enter a string now: ");
char buffer[200];
read(0,buffer,200);
printf("The input string is: %s", buffer);
printf("which is: %s\n", buffer);
printf("Now please enter another message: ");
fgets(buffer,200,stdin);
write(1,buffer,200);

return 0;
}

我会收到这些错误:

1-第一次 scanf 之后,它不会只显示输入字符串的消息。

2-我现在写的就是将要保存在字符串中的内容。

3-它将跳过最后的 fgets...

输出示例: enter image description here

这根本没有任何意义;我想得到这样的输出:

Enter an integer: 15
The input number is: 15
Please enter a string now: This is the message1
The input string is: This is the message1 which is: This is the message1
Now please enter another message: This is the message2
This is the message2

感谢您的帮助!

最佳答案

有趣的问题。在同一底层上混合标准 I/O(scanf()fgets())和文件描述符 I/O(read())文件描述符(0 又名标准输入;stdin 作为文件流)充其量是有问题的。你会得到奇怪的效果。

在文件流级别,当输入来自终端时,stdinstdout 之间存在某种同步; stdout 上的待处理输出通常会被库刷新。当您使用read()时,没有这样的同步。这就是为什么只有在您按回车键后才会出现提示的原因。

当您输入数字 1 时,您还提供了一个换行符。标准 I/O 缓冲换行符;保留它以便下一个文件流操作可以读取它。然后用read()读取一行。它不知道标准 I/O 缓冲区,因此它等待来自终端的新输入行。您需要捕获读取了多少数据,因为输入不是 null 终止的;这是标准 I/O 库提供的服务,而不是低级 read() 函数。

当您调用 fgets() 时,它会读取缓冲的换行符(读取整数时未由 scanf() 处理)并返回空行.

请注意,如果您有任何缓冲输出正在等待标准输出(例如,您使用了 printf("Beginning of line: "); 且没有换行符),则 write 的输出() 将出现在 stdout 上缓冲的信息之前。

使用 fread()fwrite() 将为您提供直接二进制 I/O(例如,没有空终止),但会使用相同的 I/O缓冲区作为诸如 printf()fgets() 之类的函数。使用这些函数时,您会得到混合行为 - 通常最好在单个文件流上使用 fread()/fwrite() 或文本 I/O 函数,并且不能两者兼而有之,但混合使用它们是允许的,相对容易理解,并且偶尔有用。

所以,你所看到的都是可以解释的,但是解释起来却很困难。这也清楚地表明了为什么通常不应在同一底层文件描述符上混合文件流和文件描述符 I/O,尤其是标准输入。

关于c - C 语言的读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40111631/

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