gpt4 book ai didi

c - fgets如何在该程序中工作,如何与“流”概念联系在一起?

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:19 24 4
gpt4 key购买 nike

我很难理解一段代码的特性,这段代码的目的是演示fgets()函数的输入。在继续之前,我想确保我对I/O和流的理解是正确的,并且我没有完全偏离基准:
C语言中的输入和输出对于处理字符串没有特定的可行函数。专门用于处理字符串的一个函数是“gets()”函数,它将接受超出char数组限制的输入来存储输入(因此除了向后兼容之外,它实际上是非法的),并创建缓冲区溢出。
这就引出了流的主题,据我所知,它是一个解释程序中I/O的模型。流被认为是“流动的水”,程序使用的数据在其上传输。参见链接:(也作为传送带)
Can you explain the concept of streams?
What is a stream?
在C语言中,有3个预定义的ANSII流用于标准输入和输出,如果使用windows或DOS,则还有2个附加流,如下所示:
标准输入(键盘)
标准输出(屏幕)
stderr(屏幕)
stdprn(打印机)
stdaux(串行端口)
如我所理解的,为了使事情易于处理,可以将这些视为存在于操作系统中的河流,程序使用I/O函数将数据放入其中,从它们中取出数据,或者改变流流向的方向(例如读取或写入文件将需要)。不要想流的“开始”或“结束”:这是由操作系统处理的。你需要关心的是水把你的数据带到哪里,这是通过使用特定的函数(例如printf()puts()gets()fgets()fgets()等)来实现的。
这就是我的问题开始形成的地方。现在我有兴趣了解fgets()函数以及它如何与流联系起来。fgets()使用“stdin”流(自然)并具有内置的故障保护(见下文),不允许用户输入超过用于存储输入的数组。这里是fgets()函数的概要,而不是它的原型(我不明白为什么需要声明它?):

char *fgets(char *str , int n , FILE *fp);

注意fgets函数采用的三个参数:
p1是存储输入的地址(一个指针,可能只是您使用的数组的名称,例如“buffer”)
P2是要输入的字符的最大长度(我想这就是我的问题所在!)
p3指定输入流,在这段代码中是“stdin”(什么时候会不同?)
现在,我下面的代码将允许您键入字符,直到您的心满足。当您点击return时,输入将以第二个参数长度减去1(MAXLEN-1)的行在屏幕上打印。当您输入一个没有其他文本的返回时,程序终止。
#include <stdio.h>

#define MAXLEN 10

int main(void)
{
char buffer[MAXLEN];

puts("Enter text a line at a time: enter a blank line to exit");

while(1)
{
fgets(buffer, MAXLEN, stdin); //Read comments below. Note 'buffer' is indeed a pointer: just to array's first element.

if(buffer[0] == '\n')
{
break;

}
puts(buffer);
}
return 0;
}

下面是我的问题:
1)这个程序允许我输入无限字符吗?我没有看到使 gets()fgets()更安全的机制,因为我正在存储输入的数组的大小有限(在本例中是256)。我唯一看到的事情是我的输入字符串被解析成MAXLEN-1片段?我在 fgets()中没有看到什么可以阻止get()没有的缓冲区溢出?在 中存在故障安全的参数中,我看不到。
2)为什么程序打印的输入行是MAXLEN-1而不是MAXLEN?
3)函数第二个参数的意义是什么?当我运行程序时,我可以键入任意多的字符。MAXLEN如何防止缓冲区溢出?根据我的猜测,当用户输入一个大的长字符串时,一旦用户点击return,MAXLEN就会将字符串切碎成MAXLEN大小的位/字节(两者实际上都在这里工作lol),并将它们发送到数组。我肯定我错过了一些重要的事情。
这是一个口头禅,但我对这个非常重要的主题缺乏理解,这使我的代码薄弱。

最佳答案

问题1
实际上,您可以键入命令行工具允许您每次输入的字符数。但是,在您的示例中,调用fgets()只处理MAXLEN,因为您告诉他这样做。
此外,fgets()内部没有安全检查。给fgets的第二个参数是“safety”参数。尝试将对fgets的调用更改为fgets(buffer, MAXLEN + 10, stdin);,然后键入超过MAXLEN个字符。您的程序将崩溃,因为您正在访问未分配的内存。
问题2
当您调用fgets()时,它将读取MAXLEN - 1个字符,因为最后一个字符保留给字符代码\0,这通常意味着字符串结束
FGSH()的第二个参数不是要存储的字符数,而是缓冲区的最大容量。你总是要考虑字符串终止字符\0
问题3
如果你以前不知道这两个答案,你可以自己回答这个问题。尝试使用此值。使用不同于缓冲区大小的值。
还有,你说
p3指定输入流,在这段代码中是“stdin”(什么时候会不同?)
可以使用fgets读取存储在计算机上的文件。下面是一个例子:

char buffer[20];
FILE *stream = fopen("myfile.txt", "r"); //Open the file "myfile.txt" in readonly mode

fgets(buffer, 20, stream); //Read the 19 first characters of the file "myfile.txt"
puts(buffer);

关于c - fgets如何在该程序中工作,如何与“流”概念联系在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19609833/

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