当前位置: 首页 > backend >正文

C 语言字符串输入输出:scanf, gets, fgets 的选择与陷阱

各类资料学习下载合集

​​https://pan.quark.cn/s/8c91ccb5a474​​

在 C 语言编程中,处理字符串是常见的任务之一。而将字符串从用户(通常通过键盘)读取到程序中,以及将程序中的字符串显示给用户,是字符串处理的基础。本文将深入探讨 C 语言中用于字符串输入输出的几个核心函数:​​printf​​, ​​scanf​​, ​​gets​​, 和 ​​fgets​​,并通过详细的代码示例,帮助您理解它们的用法、特性以及潜在的风险,特别是如何安全地进行字符串输入。

1. 字符串输出:​​printf​​ 的 ​​%s​

首先,我们来看字符串的输出。在 C 语言中,我们主要使用 ​​printf​​ 函数配合 ​​%s​​ 格式说明符来打印字符串。​​%s​​ 格式说明符期望接收一个字符数组(也就是字符串)的起始地址,然后从该地址开始,逐个打印字符,直到遇到字符串的结束标志 ​​\0​​ 为止。

#include <stdio.h>int main() {printf("--- 字符串输出示例 ---\n");char my_string[] = "Hello, C Language!"; // 使用字符串字面量初始化,编译器自动添加 '\0'printf("使用 %%s 打印字符串:\n");printf("%s\n", my_string); // %s 遇到 '\0' 停止打印printf("--- 示例结束 ---\n");return 0;
}

编译和运行:

gcc print_string.c -o print_string
./print_string

运行结果:

--- 字符串输出示例 ---
使用 %s 打印字符串:
Hello, C Language!
--- 示例结束 ---

​printf("%s", ...)​​ 的使用相对简单,只要确保您传递的是一个以 ​​\0​​ 结尾的有效 C 语言字符串即可。

2. 字符串输入:挑战与不同函数

字符串输入相对复杂,因为用户可能输入包含空格的文本,而不同的输入函数处理空格和换行符的方式不同。

2.1 ​​scanf​​ 函数与 ​​%s​

​scanf​​ 函数是 C 语言中常用的输入函数,配合 ​​%s​​ 格式说明符可以读取字符串。然而,​​scanf​​ 在读取字符串时有一个非常重要的特性:它会跳过开头的空白字符(空格、制表符、换行符),然后从第一个非空白字符开始读取,直到遇到下一个空白字符为止。这意味着 ​​scanf("%s", ...)​​ 只能读取单个词,无法读取包含空格的整行文本。

此外,​​scanf​​ 不会检查你提供的字符数组缓冲区的大小,如果用户输入的字符串长度超过了缓冲区的大小,就会发生缓冲区溢出,这是非常危险的。虽然可以通过 ​​%ns​​ (其中 n 是数字) 来限制读取的最大字符数(如 ​​%9s​​ 最多读 9 个字符 + ​​\0​​),但这种方式仍然不够灵活和安全。

示例代码 2.1:

#include <stdio.h>int main() {printf("--- 使用 scanf 读取字符串 ---\n");char buffer[20]; // 定义一个大小为 20 的字符数组printf("请输入一个字符串 (包含空格测试):\n");// 使用 %s 读取字符串// 
http://www.xdnf.cn/news/7098.html

相关文章:

  • Word文档图片和图表自动添加序号
  • 基于区块链技术的供应链溯源系统:重塑信任与透明度
  • 信奥赛-刷题笔记-栈篇-T2-P3056括号调整问题0518
  • Android日活(DAU)检测的四大实现方案详解
  • 代码随想录算法训练营 Day49 图论Ⅰ 深度优先与广度优先
  • mongodb管理工具的使用
  • 几种基于比较的排序
  • Linux搜索
  • 初始C++:类和对象(中)
  • 第10章 输入与输出流
  • Ansible模块——文件内容修改
  • IntelliJ IDEA设置编码集
  • ngx_http_referer_module 模块概述
  • Protect Your Digital Privacy: Obfuscate, Don’t Hide
  • GLPK(GNU线性规划工具包)中建模语言MathProg的使用
  • 【Linux网络】多路转接poll
  • ESP32C3在ESP-IDF中的nvs操作
  • Django 项目创建全攻略
  • R for Data Science(3)
  • oppo手机安装APK失败报错:安装包异常
  • 常见的数据库问题
  • Binary Prediction with a Rainfall Dataset-(回归+特征工程+xgb)
  • 【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率
  • Popeye
  • UnLua源码分析(一)初始化流程
  • 13.Ext系列文件系统
  • 【2025版】SpringCloud Gateway网关快速入门
  • 相机Camera日志分析之十二:高通相机Camx hal拍照1帧logcat日志capture拍照帧详解
  • 基于CNN的猫狗识别(自定义CNN模型)
  • AIDA64 extreme7.5 版本注册激活方法