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

字符串类问题(机试必考)

核心考点:字符串遍历、字符分类处理、ASCII 码运算、边界值处理

经典例题:文本加密

题目描述

加密规则:

  • 大写字母:A→D、B→E…Y→B、Z→C(后移 3 位,循环)
  • 小写字母:a→d、b→e…y→b、z→c(同上)
  • 其他字符(数字、空格、符号):不处理

输入样例:I love 007→ 输出样例:L oryh 007

完整可运行代码

#include <stdio.h> #include <string.h> int main() { // 定义足够大的字符数组(长度<100,预留结束符和换行符空间) char s[105] = {0}; // 读取一行字符串(替代不安全的gets()) fgets(s, sizeof(s), stdin); // 去掉fgets读取的换行符(关键!否则输出会多一行空行) int len = strlen(s); if (len > 0 && s[len-1] == '\n') { s[len-1] = '\0'; len--; } // 遍历每个字符进行加密 for (int i = 0; i < len; i++) { // 处理大写字母 if (s[i] >= 'A' && s[i] <= 'Z') { s[i] += 3; // 后移3位 if (s[i] > 'Z') { // 超出Z则循环到开头 s[i] -= 26; } } // 处理小写字母 else if (s[i] >= 'a' && s[i] <= 'z') { s[i] += 3; // 后移3位 if (s[i] > 'z') { // 超出z则循环到开头 s[i] -= 26; } } // 其他字符(数字、空格等)不处理 else { continue; } } // 输出加密后的字符串 puts(s); return 0; }

代码关键说明

  1. 字符读取
    • fgets(数组名, 数组长度, stdin):安全读取一行,包含空格,避免缓冲区溢出;
    • 必须去掉fgets读取的换行符\n(否则输出会多一行空行)。
  2. ASCII 码运算
    • 大写字母A-Z的 ASCII 码范围:65-90;
    • 小写字母a-z的 ASCII 码范围:97-122;
    • 后移 3 位后若超出范围,减 26(字母总数)实现循环。
  3. 边界处理
    • Z+3 = 90+3=93 > 9093-26=67(对应 C);
    • z+3 = 122+3=125 > 122125-26=99(对应 c)。

字符串类高频扩展题型(附解题思路)

1. 统计字符个数

需求:输入字符串,统计大写字母、小写字母、数字、其他字符的数量。核心代码

int upper = 0, lower = 0, digit = 0, other = 0; for (int i = 0; s[i] != '\0'; i++) { if (s[i] >= 'A' && s[i] <= 'Z') upper++; else if (s[i] >= 'a' && s[i] <= 'z') lower++; else if (s[i] >= '0' && s[i] <= '9') digit++; else other++; }

2. 单词首字母大写

需求:输入字符串(单词间用空格分隔),将每个单词首字母大写,其余小写。核心思路

  • 第一个字符直接大写;
  • 遇到空格后,下一个字符大写,其余字符小写。核心代码
// 初始化:第一个字符大写 if (s[0] >= 'a' && s[0] <= 'z') s[0] -= 32; // 遍历后续字符 for (int i = 1; s[i] != '\0'; i++) { if (s[i-1] == ' ' && s[i] >= 'a' && s[i] <= 'z') { s[i] -= 32; // 空格后首字母大写 } else if (s[i] >= 'A' && s[i] <= 'Z') { s[i] += 32; // 其他字母小写 } }

3. 统计子串出现次数

需求:输入主字符串和子字符串,统计子串在主串中出现的次数(不重叠)。核心思路

  • 遍历主串,逐个位置匹配子串;
  • 匹配成功则计数 + 1,跳过子串长度继续遍历。核心代码
char main_str[100], sub_str[20]; fgets(main_str, 100, stdin); fgets(sub_str, 20, stdin); // 去掉换行符(同上) int main_len = strlen(main_str), sub_len = strlen(sub_str); if (main_str[main_len-1] == '\n') main_str[--main_len] = '\0'; if (sub_str[sub_len-1] == '\n') sub_str[--sub_len] = '\0'; int count = 0; // 遍历主串(剩余长度≥子串长度才匹配) for (int i = 0; i <= main_len - sub_len; i++) { int match = 1; for (int j = 0; j < sub_len; j++) { if (main_str[i+j] != sub_str[j]) { match = 0; break; } } if (match) { count++; i += sub_len - 1; // 跳过已匹配部分,避免重叠 } } printf("子串出现次数:%d\n", count);

4. 单词反序

需求:输入字符串(如I love China),输出单词反序(China love I)。核心思路

  • 先反转整个字符串(anihC evol I);
  • 再反转每个单词(China love I)。

总结

  1. 字符串题核心:遍历 + ASCII 码运算 + 边界处理
  2. 字符分类判断:牢记A-Z(65-90)a-z(97-122)0-9(48-57)的 ASCII 范围;
  3. 避坑要点:
    • 不用gets(),改用fgets()并处理换行符;
    • 循环移位(如加密)需判断溢出,用-26实现字母循环;
    • 子串匹配要注意 “不重叠” 和 “剩余长度足够”。
http://www.jsqmd.com/news/520924/

相关文章:

  • MATLAB硬件支持包:从离线安装到自定义集成的进阶指南
  • 邯郸家长做近视防控,为啥总爱选眼妈妈
  • LiuJuan20260223Zimage与卷积神经网络结合:图像分类任务优化实践
  • Qwen3-0.6B-FP8入门:计算机组成原理知识问答机器人搭建
  • StructBERT零样本分类-中文-base镜像免配置:支持K8s Helm Chart一键部署
  • 【技术解析】Pipeline ADC中放大器增益为何必须为2的幂次?
  • 2026年比较好的船型电动工具开关工厂推荐:TS扳机电动工具开关/DT直流扳机电动工具开关/DW交流转盘调节器电动工具开关精选厂家推荐 - 品牌宣传支持者
  • USB协议三要素:包、事务与传输深度解析
  • 智能安防新方案:实时手机检测-通用镜像在考场监控中的应用
  • 设备预测性维护方案设计的关键要素
  • NET6加持下的AGV调度系统3.0:性能优化与功能增强全解析
  • SEO_如何避开常见SEO误区?这5点必须注意
  • 方言AI来了!用GLM-4-Voice模型实现粤语/重庆话智能客服的完整指南
  • Pixel Dimension Fissioner 创意广告设计实战:快速生成多版本营销素材
  • 【标题】告别无效搜索!一个汇聚前沿技术与工具的开发者宝藏导航站 LinkWord
  • QT编程(16): Qt Model
  • SEO_内容营销中融入SEO的关键方法与案例
  • MySQL Server 5.5 win端安装,安装SQLyog
  • 基于龙蜥anolis在gpu上通过docker手动编译部署ollama
  • (实战避坑篇) PyTorch与PyTorch3D环境搭建:从版本匹配到一键部署
  • 基于YOLOv8/YOLOv10/YOLOv11/YOLOv12与SpringBoot的火箭检测系统(DeepSeek智能分析+web交互界面+前后端分离+YOLO数据)
  • OpenClaw+GLM-4.7-Flash私人教练:健康数据分析与运动计划生成
  • 告别手动录制!用rosbag2_bag_v2_plugins插件,5分钟搞定ROS1到ROS2的bag文件迁移
  • SqlSugar vs EF Core:在PostgreSQL项目中如何选择?性能对比与实战建议
  • 为什么GeoJSON.io是地理数据编辑的终极解决方案
  • FLUX小红书极致真实V2图像生成工具VSCode开发环境配置
  • 2026年度高清家用投影仪权威盘点:从行业趋势到终极选购指南
  • 原来HTML标签那么简单!小白也能看懂的前端第一课
  • Conda虚拟环境安装matplotlib报错?试试这个pip安装避坑指南(附版本选择建议)
  • 先验自感与经验自感:一个概念的双重显影