首页 > 编程笔记

C语言gets():输入一个字符串

gets() 是 C语言标准库提供的函数,定义在<stdio.h>头文件中。

gets() 用于从标准输入(通常是键盘)读取一个字符串,直到遇到换行符(Enter键)为止,最终将读取到的字符串存储到指定的字符数组中,并在字符串的末尾添加'\0'

gets() 函数的原型如下:

char *gets(char *str);

参数

str 是 char* 类型的指针,指向存储字符串的字符数组。

返回值

返回一个 char* 类型的指针,它指向的是成功读取的字符串。

【实例】用 gets() 函数读取某个用户的姓名,请看下面的 C语言代码。
#include <stdio.h>

int main() {
    char name[50]; // 用于存储输入的字符串

    printf("请输入您的名字:");
    gets(name); // 读取用户输入的一行文本

    printf("您输入的名字是:%s\n", name);

    return 0;
}
执行结果为:

请输入您的名字:http://c.biancheng.net
您输入的名字是:http://c.biancheng.net

慎重使用gets()函数

由于 gets() 存在缓冲区溢出的安全风险,从 C11 标准开始已被废弃。

在上面的实例中,name 数组最多只能存储 50 个字符,而 gets() 函数读取的字符串长度很可能大于 50。这种情况下,用户输入的内容超过了数组的大小,数据会覆盖到相邻的内存区域,就称为缓冲区溢出。缓冲区溢出会导致程序的运行变得不稳定,甚至崩溃。

从 C11 标准开始,不再推荐使用 gets() 函数。取而代之,更安全的选择是使用 fgets() 函数。以下是使用 fgets() 函数的示例。
#include <stdio.h>

int main() {
    char name[50]; // 用于存储输入的字符串

    printf("请输入您的名字:");
    fgets(name, sizeof(name), stdin); // 读取用户输入的一行文本

    printf("您输入的名字是:%s\n", name);

    return 0;
}
输出结果为:

请输入您的名字:http://c.biancheng.net
您输入的名字是:http://c.biancheng.net

在这个示例中,我们使用了 fgets() 函数,它需要提供目标缓冲区的大小作为第二个参数,以及文件指针 stdin 作为第三个参数,表示从标准输入读取。这样可以确保输入不会超出缓冲区的大小,从而避免了缓冲区溢出问题。

推荐阅读