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

C中的字符串输出

我们常接触的字符串输入函数有常见的gets() fgets() scanf("%s") 我们将分开介绍

0)什么是不检查边界?

  假如一个int数组申请了十个元素的空间,但是有些函数在输入的时候不会检查边界,如果输入超过10个元素,会直接越界修改后面的内存中的元素。

  可能会导致:缓冲区溢出攻击、程序崩溃、数据损坏。

1)gets()

  gets()不检查函数边界,在C11被废弃。会导致缓冲区溢出。他会一直读取到换行符,换行符已经被读取,但是并不存储(读取并丢弃)。会在字符串末尾添加'\0'。

 

image

 

image

 

 2)fgets()

  fgets()是最为推荐的函数,

#include <stdio.h>  // 必需的头文件
char *fgets(char *str, int n, FILE *stream);

image

   请注意,n是包含'\0'的。

image

  他的特点是:安全(不会从缓冲区溢出),读取整行(包括空格和换行符)。

#include <stdio.h>
#include <string.h>  // 用于字符串处理int main() {char name[50];printf("请输入你的名字: ");fgets(name, sizeof(name), stdin);// 去掉换行符name[strcspn(name, "\n")] = '\0';printf("你好,%s!\n", name);return 0;
}
#include <stdio.h>
#include <string.h>int main() {FILE *file = fopen("data.txt", "r");char line[256];if (file == NULL) {printf("无法打开文件\n");return 1;}// 逐行读取文件while (fgets(line, sizeof(line), file) != NULL) {// 去掉换行符line[strcspn(line, "\n")] = '\0';printf("%s\n", line);}fclose(file);return 0;
}

  那么如何处理多读进来的换行符呢?以下是三种方式,建议第一种。

 

char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';  // 简洁高效
char str[100];
fgets(str, sizeof(str), stdin);char *newline = strchr(str, '\n'); // 找第一个元素出现的地方
if (newline) {*newline = '\0';
}
char str[100];
fgets(str, sizeof(str), stdin);size_t len = strlen(str);
if (len > 0 && str[len-1] == '\n') {str[len-1] = '\0';
}

  Windows和Linux换行符差异

// Windows: \r\n
// Linux: \n
// OJ通常是Linux环境// 安全处理:同时去掉\r和\n
char *pos;
if ((pos = strchr(str, '\r')) != NULL) *pos = '\0';
if ((pos = strchr(str, '\n')) != NULL) *pos = '\0';

  fgets() 读取空行

// 用户直接按回车
fgets(str, sizeof(str), stdin);
// str的内容是: "\n\0"// 处理:检查是否空行
if (str[0] == '\n') {printf("输入了空行\n");str[0] = '\0';  // 设为空字符串
}

   混合输入(数字+字符串)

#include <stdio.h>
#include <string.h>int main() {int age;char name[50];printf("年龄: ");scanf("%d", &age);// 关键:清除输入缓冲区中的换行符while (getchar() != '\n');printf("姓名: ");fgets(name, sizeof(name), stdin);name[strcspn(name, "\n")] = '\0';printf("%s今年%d岁\n", name, age);return 0;
}

3)scanf("s");

  仍然不检查边界,可以通过“9s"来检查边界。

  • 遇到空白字符(空格、制表符、换行符)就停止

  • 不会读取空白字符,留它们在输入缓冲区
  • 在字符串末尾添加 \0

  所以需要我们用getchar()清除掉空白符。或用" %s"清除前导空白符。

http://www.jsqmd.com/news/181964/

相关文章:

  • 边疆地区教育公平:少数民族学生享受优质语音资源
  • 比利时巧克力工厂:参观者了解制作工艺全过程
  • 河南少林寺:武僧晨练时整齐划一的呼喝声
  • 奥地利音乐之都:维也纳新年音乐会AI伴奏
  • 元宇宙语音交互基石:VoxCPM-1.5-TTS-WEB-UI构建沉浸式对话体验
  • 你还在手动强转?JDK 23 instanceof int让类型判断变得如此智能!
  • 远古祭祀仪式重现:宗教学者研究早期文明形态
  • 辽宁沈阳故宫:满清皇室昔日的庄严诏令再现
  • Debian server 安装
  • 浙江杭州西湖:断桥残雪旁情侣许愿的私语呢喃
  • 2026国内维生素 B 族排名出炉!中老年人、熬夜党、上班族必看的高性价比清单 - 博客万
  • AI伦理讨论焦点:VoxCPM-1.5-TTS-WEB-UI能否被滥用于伪造录音?
  • 塔吉克斯坦高山村落:孩子们朗读课本的声音
  • isrdbg32.dll文件损坏丢失找不到 打不开程序 免费下载方法
  • A*算法 - ukyo-
  • 空间音频处理技术揭秘:沉浸式声音背后的科学与工程
  • 菲律宾海滩度假:游客收到每日天气语音提醒
  • 电商主播替代方案:用VoxCPM-1.5-TTS-WEB-UI生成商品介绍语音
  • 印度宝莱坞歌曲翻唱:AI模仿阿米尔·汗演唱电影插曲
  • 深入解析:49、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(一)
  • ZGC分代模式揭秘:如何实现亚毫秒级停顿与高效内存管理
  • DL 第一讲 PyTorch基础
  • 微PE官网同源技术社区推荐:AI语音新星VoxCPM-1.5-TTS-WEB-UI发布
  • GitHub镜像网站同步更新:VoxCPM-1.5-TTS-WEB-UI开源语音模型上线
  • Asyncio事件监听机制详解:5个关键点让你避开90%的陷阱
  • 超越BeyondCompare4永久激活密钥的价值?试试这颗开源语音明珠
  • 基于YOLOv8的道路坑洼识别检测系统(YOLOv8深度学习+YOLO数据集+UI界面+Python项目源码+模型)
  • 火星殖民地设想:第一批移民将携带语音数据库
  • Java虚拟线程时代来临(线程池配置终极指南)
  • 为什么VoxCPM-1.5-TTS-WEB-UI成为当前最受欢迎的TTS网页推理工具?