45 C 语言标准输入输出函数详解:getchar、putchar、gets、puts、fgets

目录

1 getchar() 函数

1.1 功能描述

1.2 函数原型

1.3 案例演示

1.4 注意事项

2 putchar() 函数

2.1 功能描述

2.2 函数原型

2.3 案例演示

2.4 注意事项

3 gets() 函数

3.1 功能描述

3.2 函数原型

3.3 案例演示

3.4 注意事项

4 puts() 函数

4.1 功能描述

4.2 函数原型

4.3 案例演示

4.4 注意事项

5 fgets() 函数

5.1 功能描述

5.2 函数原型

5.3 案例演示

5.4 注意事项


1 getchar() 函数

1.1 功能描述

        getchar() 函数用于从标准输入流 stdin 中读取下一个可用的字符,并将其作为整数返回(因为字符在 C 语言中实际上是以整数形式存储的)。如果遇到文件结束符(EOF,即 End Of File)或者发生读取错误,则返回 EOF。

1.2 函数原型

        函数原型定义在 <stdio.h> 头文件中,因此在使用 getchar() 函数之前需要包含这个头文件。

#include <stdio.h>
int getchar(void);
  • 参数:getchar() 函数没有参数。
  • 返回值正常情况下,getchar() 返回从标准输入读取到的下一个字符,以整数形式表示如果到达文件结束或发生读取错误,则返回 EOF(通常定义为 -1)

1.3 案例演示

#include <stdio.h>

int main()
{
    int ch; // 使用 int 类型来存储 getchar() 的返回值,以便处理 EOF

    printf("请输入一个字符: ");
    ch = getchar(); // 读取用户输入的一个字符

    if (ch != EOF)
    {
        printf("您输入的字符是: %c\n", ch); // 显示用户输入的字符
    }
    else
    {
        printf("读取输入时发生错误。\n");
    }

    return 0;
}

        输出结果如下所示:

1.4 注意事项

        缓冲区问题getchar() 会从标准输入的缓冲区中读取字符。如果之前有其他输入操作(如使用 scanf() 输入字符串或数字),而用户输入后多按了回车键,那么这个换行符(\n)会被 getchar() 读取。为了避免这种情况,可以在调用 getchar() 之前清空输入缓冲区,例如使用 while ((ch = getchar()) != '\n' && ch != EOF); 来读取并丢弃所有直到换行符的字符。

        EOF 处理:当 getchar() 遇到文件结束或输入错误时,会返回 EOF。在程序中应该检查返回值是否为 EOF,以正确处理这些情况。

        变量类型:由于 getchar() 的返回值可能是一个字符(0 到 255 之间的整数)或者是 EOF(通常为 -1),所以建议使用 int 类型而不是 char 类型来存储 getchar() 的返回值,以确保可以正确地检测到 EOF。

        阻塞行为:当 getchar() 被调用且标准输入缓冲区中没有可用数据时,程序会暂停执行,等待用户输入。这意味着 getchar() 是一个阻塞调用。


2 putchar() 函数

2.1 功能描述

        putchar() 函数用于将一个字符写入标准输出流 stdout。如果写入成功,函数返回该字符;如果发生写入错误,则返回 EOF。

2.2 函数原型

        函数原型定义在 <stdio.h> 头文件中,因此在使用 putchar() 函数之前需要包含这个头文件。

#include <stdio.h>
int putchar(int c);

参数:

  • c要写入标准输出的字符。虽然参数类型是 int,但实际上只需要传入一个字符即可。这是因为字符在 C 语言中是以整数形式存储的,而 putchar() 需要能够处理 EOF(通常定义为 -1),所以参数类型是 int。

返回值:

  • 如果写入成功,返回写入的字符(以 int 形式)
  • 如果发生写入错误,返回 EOF(通常定义为 -1)

2.3 案例演示

#include <stdio.h>

int main()
{
    int c;

    printf("请输入一些文本(按 Enter 结束输入):\n");

    // 读取用户输入的每个字符
    // 读取直到遇到换行符
    while ((c = getchar()) != '\n')
    {
        // 输出读取到的字符
        putchar(c);
    }

    // 输出换行符,使输出更加整洁
    putchar('\n');

    return 0;
}

        输出结果如下所示:

2.4 注意事项

        参数类型:虽然 putchar() 的参数类型是 int,但在实际使用中通常传递一个 char 类型的字符。这是因为字符在 C 语言中是以整数形式存储的,而 putchar() 需要能够处理 EOF(通常定义为 -1),所以参数类型是 int。

        错误处理:putchar() 在写入失败时返回 EOF。在程序中应该检查返回值是否为 EOF,以正确处理这些情况。

        缓冲区问题putchar() 写入的字符可能会被缓冲,直到缓冲区满或遇到换行符(\n)才会实际写入到标准输出。如果需要立即刷新缓冲区,可以使用 fflush(stdout) 函数

        与 printf() 的区别:虽然 putchar() 和 printf() 都可以用于输出字符,但 putchar() 更简单,只用于输出单个字符,而 printf() 可以格式化输出多个数据类型。


3 gets() 函数

3.1 功能描述

        gets() 函数用于从标准输入流 stdin 读取一行字符(直到遇到换行符 \n 或文件结束符 EOF),并将读取的字符存储到指定的字符数组中换行符 \n 不会被存储到数组中,但在读取过程中会被消耗掉。读取完成后,会在数组末尾添加一个空字符 \0 以终止字符串

3.2 函数原型

        函数原型定义在 <stdio.h> 头文件中,因此在使用 gets() 函数之前需要包含这个头文件。

#include <stdio.h>
char *gets(char *str);

参数:

  • str指向字符数组的指针,用于存储读取的字符串

返回值:

  • 成功时,返回 str,即指向读取字符串的指针
  • 如果遇到文件结束符 EOF 或读取错误,返回 NULL

3.3 案例演示

#include <stdio.h>

int main()
{
    char buffer[100]; // 定义一个足够大的字符数组来存储输入的字符串

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

    // 读取一行文本
    if (gets(buffer) != NULL)
    {
        printf("您输入的文本是:\n");
        printf("%s\n", buffer); // 使用 printf() 输出字符串
    }
    else
    {
        printf("读取输入时发生错误。\n");
    }

    return 0;
}

        输出结果如下所示:

3.4 注意事项

        缓冲区溢出风险gets() 函数不会检查目标数组的大小,如果用户输入的字符串长度超过了数组的容量,会导致缓冲区溢出,从而引发严重的安全问题。因此,强烈建议避免使用 gets(),改用更安全的替代函数,如 fgets()。

        换行符处理gets() 会读取并消耗换行符 \n,但不会将其存储在目标数组中。如果后续需要处理换行符,需要注意这一点。

        结束符处理:gets() 读取完成后,会在数组末尾添加一个空字符 \0 以终止字符串

        错误处理:如果遇到文件结束符 EOF 或读取错误,gets() 会返回 NULL。在程序中应该检查返回值,以正确处理这些情况。

        替代函数推荐使用 fgets() 函数代替 gets(),因为 fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险


4 puts() 函数

4.1 功能描述

        puts() 是 C 语言标准库中用于将字符串输出到标准输出流 stdout 的函数。与 printf() 不同,puts() 专门用于输出字符串,并且在输出字符串后自动添加一个换行符 \n

4.2 函数原型

        函数原型定义在 <stdio.h> 头文件中,因此在使用 puts() 函数之前需要包含这个头文件。

#include <stdio.h>
int puts(const char *str);

参数:

  • str指向要输出的字符串的指针

返回值:

  • 成功时,返回非负值(通常是 0 或 1)
  • 如果输出失败,返回 EOF(通常定义为 -1)。 

4.3 案例演示

#include <stdio.h>

int main()
{
    char str[20]; // 定义一个字符数组来存储输入的字符串

    puts("Enter a line of text :");
    gets(str); // 读取一行文本

    puts("You entered: ");
    puts(str); // 使用 puts() 输出字符串

    return 0;
}

        输出结果如下所示:

4.4 注意事项

        换行符puts() 会在输出的字符串末尾自动添加一个换行符 \n。如果不需要换行符,可以使用 fputs() 函数,它不会自动添加换行符

        错误处理:如果输出失败,puts() 会返回 EOF。在程序中应该检查返回值,以正确处理这些情况。使用 fprintf(stderr, ...) 将错误信息输出到标准错误流 stderr,而不是标准输出流 stdout,以确保错误信息不会与正常输出混淆。

        字符串终止符puts() 要求字符串必须以空字符 \0 终止。如果传入的字符串不是以 \0 终止的,可能会导致未定义行为。


5 fgets() 函数

5.1 功能描述

        fgets() 是 C 语言标准库中用于从输入流中读取一行字符的函数。与 gets() 不同,fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险fgets() 会读取指定数量的字符(包括换行符 \n),并将读取的字符存储到指定的字符数组中,最后在数组末尾添加一个空字符 \0 以终止字符串

5.2 函数原型

        函数原型定义在 <stdio.h> 头文件中,因此在使用 fgets() 函数之前需要包含这个头文件。

#include <stdio.h>
char *fgets(char *str, int n, FILE *stream);

参数:

  • str指向字符数组的指针,用于存储读取的字符串
  • n要读取的最大字符数(包括终止空字符 \0)实际读取的字符数最多为 n-1,以确保有足够的空间存储终止空字符。
  • stream输入流,通常为 stdin 表示标准输入

返回值:

  • 成功时,返回 str,即指向读取字符串的指针
  • 如果遇到文件结束符 EOF 或读取错误,返回 NULL

5.3 案例演示

#include <stdio.h>

int main()
{
    char str[100]; // 定义一个足够大的字符数组来存储输入的字符串

    printf("Enter a line of text :");

    // 读取一行文本
    if (fgets(str, sizeof(str), stdin) != NULL)
    {
        printf("You entered: ");
        // printf("%s\n", str); // 使用 printf() 输出字符串
        puts(str); // 自动添加一个换行符 \n
    }
    else
    {
        printf("读取输入时发生错误。\n");
    }

    return 0;
}

        输出结果如下所示:

5.4 注意事项

        缓冲区溢出保护:fgets() 允许指定最大读取长度,从而避免缓冲区溢出的风险。这使得 fgets() 比 gets() 更安全。实际读取的字符数最多为 n-1,以确保有足够的空间存储终止空字符 \0。

        换行符处理:fgets() 会读取并存储换行符 \n(如果在读取的字符数范围内)。如果需要去除换行符,可以手动处理:

size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
    str[len - 1] = '\0';
}

        错误处理:如果遇到文件结束符 EOF 或读取错误,fgets() 会返回 NULL。在程序中应该检查返回值,以正确处理这些情况。可以使用 fprintf(stderr, ...) 将错误信息输出到标准错误流 stderr,而不是标准输出流 stdout,以确保错误信息不会与正常输出混淆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thanks_ks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值