gets函数,C语言gets函数详解

C语言中的gets函数详解及其使用示例
本文详细介绍了C语言中的gets函数,包括其功能、使用方法和示例。通过对比scanf,展示了gets函数在输入字符串时的便捷性和处理空格的能力。同时,文章还提醒了使用gets函数时需要注意的事项,例如它会丢弃末尾的换行符,以及在后续输入处理中可能带来的影响。

gets函数,C语言gets函数详解

在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为:

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

这个函数很简单,只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。

gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。

下面将前面中使用 scanf 输入字符串的程序改一下:

# include <stdio.h>
int main(void)
{
    char str[20] = "\0";  //字符数组初始化\0
    printf("请输入字符串:");
    gets(str);
    printf("%s\n", str);
    return 0;
}

输出结果是:
请输入字符串:i love you
i love you

可见,gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。也就是说:

gets(str);

完全可以取代:

scanf("%s", string);

不仅代码更简洁,而且可以直接输入带空格的字符串。同样,前面章节中,对字符指针变量所指向的内存单元进行初始化也可以用 gets(),下面将那个程序也改一下,将 scanf 换成 gets():

# include <stdio.h>
int main(void)
{
    char str[30];
    char *string = str;  //一定要先将指针变量初始化
    printf("请输入字符串:");
    gets(string);  //也可以写成gets(str);
    printf("%s\n", string);  //输出参数是已经定义好的“指针变量名”
    return 0;
}

输出结果是:
请输入字符串:Hi i…like you
Hi i…like you

此外,关于使用 gets() 函数需要注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。下面写一个程序验证一下:

# include <stdio.h>
int main(void)
{
    char str[30];
    char ch;
    printf("请输入字符串:");
    gets(str);
    printf("%s\n", str);
    scanf("%c", &ch);
    printf("ch = %c\n", ch);
    return 0;
}

输出结果是:
请输入字符串:i love you
i love you
Y
ch = Y

我们看到,没有清空缓冲区照样可以输入’Y’,因为 gets() 已经将缓冲区中的回车取出来丢掉了。如果前面使用的不是 gets() 而是 scanf,那么通过键盘给 ch 赋值前就必须先使用 getchar() 清空缓冲区。

在编程中,`gets` 是一个用于从标准输入读取字符串的函数,常见于 C 语言中。它定义在 `<stdio.h>` 头文件中,其原型为: ```c char *gets(char *s); ``` 该函数从标准输入(通常是键盘)读取一行字符,直到遇到换行符或文件结束符,并将读取的内容存储到指针 `s` 所指向的字符数组中。换行符不会被包含在结果中,而是被替换为字符串结束符 `\0`。需要注意的是,`gets` 函数不会检查目标数组的大小,因此如果输入的字符串长度超过了数组的容量,会导致缓冲区溢出,这可能引发程序崩溃或者安全漏洞。 由于这个原因,`gets` 函数在 C99 标准中已经被标记为不推荐使用,并且在 C11 标准中被完全移除。取而代之的是更安全的 `fgets` 函数,它可以指定最大读取长度,从而避免缓冲区溢出的问题。`fgets` 的原型如下: ```c char *fgets(char *s, int size, FILE *stream); ``` 其中 `size` 参数指定了最多可以读取的字符数(包括最后的空字符 `\0`),`stream` 指向了输入流,通常为 `stdin` 表示标准输入。 例如,使用 `fgets` 安全地读取用户输入的代码示例如下: ```c #include <stdio.h> #define MAX_INPUT_LENGTH 100 int main() { char input[MAX_INPUT_LENGTH]; printf("请输入一段文字: "); if (fgets(input, MAX_INPUT_LENGTH, stdin) != NULL) { // 成功读取输入 printf("你输入的是: %s", input); } else { // 读取失败 printf("读取输入时发生错误。\n"); } return 0; } ``` 此段代码中,`fgets` 被用来从标准输入读取最多 99 个字符(加上终止的空字符),这样可以确保不会超出数组 `input` 的边界,从而提高了程序的安全性[^1]。 除了 C 语言之外,在其他一些编程语言中也可能存在名为 `gets` 的函数或方法,但它们的行为和用途可能会有所不同。比如在 Ruby 中,`gets` 方法用于从当前输入源读取下一行输入;而在 Python 中,虽然没有直接的 `gets` 函数,但可以通过 `input()` 或 `sys.stdin.readline()` 来实现类似的功能。 对于与 `gets` 相关的错误处理,开发者应当总是检查函数返回值,以确认是否成功读取了输入。此外,对于任何可能包含恶意数据的输入来源,都应采取额外的验证措施,以防止潜在的安全威胁。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值