fgets 实现 (K&R)

作者:编程家 分类: c++ 时间:2025-10-15

使用fgets函数实现输入和输出操作是K&R(Kernighan和Ritchie)C编程语言中的一种常见方法。fgets函数用于从输入流中读取一行文本,并将其存储在一个缓冲区中。本文将介绍使用fgets函数的基本用法,并给出一个简单的案例代码。

fgets函数的基本用法

fgets函数的原型如下:

c

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

其中,str是一个指向字符数组的指针,用于存储读取的文本;n是一个整数,表示要读取的最大字符数;stream是一个指向FILE结构体的指针,表示输入流。fgets函数会读取输入流中的一行文本,并将其存储在str指向的字符数组中,最多读取n-1个字符,剩余的一个字符用于存储字符串结束符'\0'。如果遇到换行符或文件结束符,fgets函数会停止读取。

下面是一个使用fgets函数实现输入和输出的简单示例代码:

c

#include

int main() {

char str[100];

printf("请输入一行文本:");

fgets(str, sizeof(str), stdin);

printf("您输入的文本是:%s", str);

return 0;

}

在上面的代码中,我们首先定义了一个大小为100的字符数组str,用于存储输入的文本。然后,使用fgets函数从标准输入流(stdin)中读取一行文本,并将其存储在str数组中。最后,使用printf函数输出读取到的文本。

使用fgets实现输入和输出的好处

使用fgets函数实现输入和输出操作有以下几个好处:

1. 可以避免缓冲区溢出问题。由于fgets函数会限制读取的字符数,因此可以有效防止输入文本超过指定缓冲区大小导致的缓冲区溢出问题。

2. 可以读取包含空格的文本。与其他输入函数(如scanf)相比,fgets函数可以读取包含空格的文本,因为它会将整行文本作为一个字符串进行处理。

3. 可以处理长文本。由于fgets函数会限制读取的字符数,因此可以处理较长的文本,而不会导致内存溢出或性能问题。

案例代码

下面是一个使用fgets函数实现输入和输出的案例代码,该代码实现了一个简单的文本编辑器,可以读取用户输入的多行文本,并将其输出到文件中。

c

#include

#define MAX_LINES 100

#define MAX_CHARS 1000

int main() {

char lines[MAX_LINES][MAX_CHARS];

FILE *file;

int line_count = 0;

printf("请输入多行文本(以空行结束):\n");

for (int i = 0; i < MAX_LINES; i++) {

fgets(lines[i], sizeof(lines[i]), stdin);

if (lines[i][0] == '\n') {

line_count = i;

break;

}

}

file = fopen("output.txt", "w");

if (file == NULL) {

printf("无法打开文件。\n");

return 1;

}

printf("成功写入文件。\n");

for (int i = 0; i < line_count; i++) {

fputs(lines[i], file);

}

fclose(file);

return 0;

}

在上面的代码中,我们首先定义了一个二维字符数组lines,用于存储用户输入的多行文本。然后,使用fgets函数循环读取用户输入的文本,直到遇到空行为止。读取到的文本存储在lines数组的相应行中,并使用line_count变量记录有效行数。

接下来,我们使用fopen函数打开一个名为output.txt的文件,以便将用户输入的文本写入到文件中。如果文件打开失败,我们会输出一条错误消息并退出程序。然后,使用fputs函数将存储在lines数组中的文本逐行写入文件中。

最后,我们使用fclose函数关闭文件,并输出一条成功写入文件的消息。

使用fgets函数可以方便地实现输入和输出操作,它不仅可以避免缓冲区溢出问题,还可以处理包含空格的文本和较长的文本。通过上述案例代码,我们可以看到如何使用fgets函数读取用户输入的多行文本,并将其写入到文件中。当然,fgets函数还有更多的用法和功能,可以根据具体需求进行灵活应用。