再学C语言46:字符串输入(2)

文章讨论了C语言中gets()函数的安全问题,因为它不检查输入是否超过存储区。fgets()函数作为改进,允许指定最大读取字符数,更安全。同时介绍了scanf()函数,它根据空白字符或指定字段宽度来读取字符串。对于不同场景,fgets()适合简洁的文本输入,而scanf()适用于格式化的混合类型数据输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gets()函数的不足:不检查预留存储区是否能够容纳实际输入的数据,多出来的字符简单地溢出到相邻的内存区

一、fgets()函数

fgets()函数改进gets()函数的上述不足,可以指定最大读入字符数

fgets()函数为文件I/O而设计,与gets()函数有3点不同:

1)需要第二个参数以说明最大读入字符数,若该参数为n,fgets()将读取最多n-1个字符

2)如果fgets()函数读取到换行符,会将其存储到字符串中,而不是像gets()函数那样丢弃

3)还需要第三个参数以说明读取哪一个文件,如果是从键盘上读取数据,可以使用stdin(代表standard input)作为该参数,stdin在stdio.h中定义

示例代码:

/* test of fgets() function */
#include <stdio.h>

#define MAXC 20

int main(void)
{
    char name[MAXC]; // 分配空间
    char * p;
    printf("I need a name:\n");
    p = fgets(name, MAXC, stdin); // 使用fgets()函数从键盘获得字符串,函数共3个参数
    printf("%s is a nice name.\n", p); // 显示,确认读取数据

    return 0;
}

运行结果:

4cde4072c705452294808cd7d278a4f6.png

注意:fgets()函数把换行字符也存储到了字符串中

对于重要的编程,应该使用fgets()而不是gets(),因为gets()不检查目标数组是否能够容纳输入,所以很不安全

二、scanf()函数

scanf()更基于获取单词而不是字符串

gets()函数会读取所有字符,直到遇到第一个换行符为止

scanf()函数使用两种方式决定输入结束:

1)如果使用%s格式,字符串读到(但不包括)下一个空白字符(空格、制表符、换行符)

2)如果指定字段宽度,比如%10s,scanf()会读入10个字符或只到遇到第一个空白字符,由二者中最先满足的那个终止输入

无论上面哪种方法,scanf()读取字符串时都是以遇到的第一个非空白字符开始

scanf()函数返回一个整数值,该值代表成功读取的项目数;或者当遇到文件结束时返回一个EOF

示例代码:

/* test of scanf() function */
#include <stdio.h>

int main(void)
{
    char name_1[20], name_2[20];
    int n;

    printf("I need 2 names:\n");
    n = scanf("%6s %10s", name_1, name_2);

    printf("the %d names are %s and %s", n, name_1, name_2);

    return 0;
}

运行结果:

945c817a1ddd403799a19af73cac0423.png


根据所需输入的特点,用gets()从键盘读取文本可能更好,简洁、易用,唯一需要注意的问题是数据大小不能超出存储区大小

scanf()主要用于以某种标准形式输入的混合类型数据的读取和转换;或者希望一次只输入一个单词

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Forster-C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值