C语言gets()与fgets() 函数的区别

 更新时间:2025年12月18日 11:05:32   作者:侯小啾  
本文主要介绍了C语言gets()与fgets() 函数的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

使用要点:

  1. 永远不要使用 gets()
  2. 总是使用 fgets() 替代 gets()
  3. 记得处理换行符
  4. 检查返回值确保读取成功
  5. 考虑输入缓冲区清理

1.gets() 函数

基本用法:

char *gets(char *str);
  • 从标准输入读取一行字符串
  • 遇到换行符或文件结束符停止
  • 不检查数组边界,存在安全隐患

示例:

#include <stdio.h>

int main() {
    char name[20];
    printf("请输入姓名:");
    gets(name);  // 危险!可能发生缓冲区溢出
    printf("你好,%s!\n", name);
    return 0;
}

⚠️ gets() 的问题

  • 缓冲区溢出风险:如果输入超过数组大小,会导致内存破坏
  • C11标准已弃用,C17标准中完全移除
  • 现代编译器会给出警告

2.fgets() 函数(推荐使用)

基本用法:

char *fgets(char *str, int n, FILE *stream);
  • str:存储字符串的缓冲区
  • n:最大读取字符数(包括结尾的\0
  • stream:输入流(stdin 表示标准输入)

示例:

#include <stdio.h>

int main() {
    char name[20];
    
    printf("请输入姓名:");
    fgets(name, sizeof(name), stdin);  // 安全!
    printf("你好,%s!\n", name);
    
    return 0;
}

3. 重要区别对比

特性gets()fgets()
安全性不安全,已弃用安全,推荐使用
边界检查有,指定最大长度
换行符处理丢弃换行符保留换行符在字符串中
返回值成功返回str,失败返回NULL成功返回str,失败返回NULL

4.fgets() 的换行符问题

fgets() 会保留换行符,需要手动处理:

#include <stdio.h>
#include <string.h>

int main() {
    char input[100];
    
    printf("输入字符串:");
    fgets(input, sizeof(input), stdin);
    
    printf("处理前的字符串:%s\n",input);
    printf("===========\n");
    
    // 去除换行符
    size_t len = strlen(input);
    if (len > 0 && input[len-1] == '\n') {
        input[len-1] = '\0';
    }
    
    printf("处理后的字符串:'%s'\n", input);
    return 0;
}

执行效果:

输入字符串:abcd efgh ijklmn
处理前的字符串:abcd efgh ijklmn  

===========
处理后的字符串:'abcd efgh ijklmn'

(可以看到,处理前的字符串自带有换行符。)

5. 实际使用示例

5.1 安全输入示例:

#include <stdio.h>
#include <string.h>

void safe_input() {
    char buffer[50];
    
    printf("请输入文本(最多%d字符):", sizeof(buffer)-1);
    
    if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        // 去除换行符
        buffer[strcspn(buffer, "\n")] = '\0';
        
        printf("你输入的是:%s\n", buffer);
        printf("字符串长度:%zu\n", strlen(buffer));
    } else {
        printf("读取失败!\n");
    }
}

int main() {
    safe_input();
    return 0;
}

执行效果:

请输入文本(最多49字符):hello,world!
你输入的是:hello,world!
字符串长度:12

5.2 处理长输入:

#include <stdio.h>

void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

int main() {
    char line[10];
    
    printf("输入字符串:");
    fgets(line, sizeof(line), stdin);
    
    // 检查是否读取了完整行
    if (line[strlen(line)-1] != '\n') {
        printf("警告:输入被截断!\n");
        clear_input_buffer();  // 清空输入缓冲区
    }
    
    printf("结果:%s\n", line);
    return 0;
}

输入字符串:hello, hello, hello, world!!!
警告:输入被截断!
结果:hello, he

到此这篇关于C语言gets()与fgets() 函数的区别的文章就介绍到这了,更多相关C语言gets()与fgets() 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt spdlog日志模块的使用详解

    Qt spdlog日志模块的使用详解

    在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog 1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧
    2025-04-04
  • boost字符串处理函数format的用法

    boost字符串处理函数format的用法

    这篇文章介绍了boost字符串处理函数format的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C/C++实现快速排序的方法

    C/C++实现快速排序的方法

    这篇文章主要介绍了C/C++实现快速排序的方法,这几天在找工作,被问到快速排序,结果想不出来快速排序怎么弄的;回来搜索了一下,现在记录下来,方便以后查看。
    2014-12-12
  • C/C++中的OpenCV读取视频与调用摄像头

    C/C++中的OpenCV读取视频与调用摄像头

    这篇文章主要介绍了C/C++中的OpenCV读取视频与调用摄像头,具有很好的参考价值,希望对大家有所帮助。
    2022-11-11
  • C++中约数定理的实例详解

    C++中约数定理的实例详解

    这篇文章主要介绍了C++中约数定理的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 深入理解C语言指针及占据内存空间

    深入理解C语言指针及占据内存空间

    这篇文章主要介绍了C语言指针及占据内存空间的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 详解C++中基类与派生类的转换以及虚基类

    详解C++中基类与派生类的转换以及虚基类

    这篇文章主要介绍了详解C++中基类与派生类的转换以及虚基类,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++自定义函数示例详解

    C++自定义函数示例详解

    在数学中,函数是一种基本的数学对象,它建立了一个集合(称为定义域)中的每个元素与另一个集合(称为值域)中的唯一元素之间的对应关系,这篇文章主要介绍了C++自定义函数示例详解,需要的朋友可以参考下
    2025-03-03
  • 基于c的for循环中改变变量值的问题

    基于c的for循环中改变变量值的问题

    本篇文章是对c语言的for循环中改变变量值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一篇文章带你了解C语言二分查找的简单应用

    一篇文章带你了解C语言二分查找的简单应用

    这篇文章主要介绍了二分查找算法在C语言程序中的使用示例,文中最后提到了使用二分查找法一个需要注意的地方,需要的朋友可以参考下
    2021-08-08

最新评论