news 2026/7/14 21:14:24

C语言之串的简单处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言之串的简单处理

题目描述

串的处理
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
1. 把每个单词的首字母变为大写。
2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
3. 把单词中间有多个空格的调整为1个空格。

输入

例如:
用户输入:
you and me what cpp2005program

输出

则程序输出:
You And Me What Cpp_2005_program

输入 this is a 99cat 输出 This Is A 99_cat
#include <stdio.h> #include <string.h> // 自定义字符判断函数 int is_letter(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } int is_digit(char c) { return c >= '0' && c <= '9'; } char to_upper(char c) { if (c >= 'a' && c <= 'z') { return c - ('a' - 'A'); // 将小写字母转换为大写,小写字母的ASCII码比对应的大写字母大32. } return c; // 如果不是小写字母,返回原字符 } int is_lower(char c) { return c >= 'a' && c <= 'z'; } int main() { char input[1001]; char output[2001]; // 输出字符串可能更长(因为可能添加下划线) int i, j = 0; //下面代码在之前的题中解释过了,移除末尾换行符的代码永远不变 // 读取一行输入 fgets(input, 1000, stdin); // 移除末尾的换行符 int len = strlen(input); if (len > 0 && input[len-1] == '\n') { input[len-1] = '\0'; len--; } int in_word = 0; // 标记是否在单词中 int prev_is_space = 1; // 标记前一个字符是否为空格,初始为1表示单词开始 char prev_char = 0; // 记录前一个字符 for (i = 0; i < len; i++) { char c = input[i];//一直到该步骤,所有字符都是通式,没有变 // 处理多个连续空格:只保留一个空格 if (c == ' ') { // 如果前一个字符不是空格,则添加一个空格 if (!prev_is_space) { output[j++] = ' '; prev_is_space = 1; } // 标记不在单词中 in_word = 0;//如果是空格,则不在单词中。 prev_char = ' ';//将该字符即下一个字符的前一个字符标记为' ' continue; } // 不在单词中的第一个非空格字符是单词首字母 if (!in_word) { // 如果是字母,转换为大写 if (is_letter(c)) { output[j++] = to_upper(c); } else { output[j++] = c; } in_word = 1; prev_is_space = 0;前一个字符不是空格 } // 在单词中的处理 else { // 处理数字和字母之间加下划线 if (prev_char != 0) { // 如果前一个字符是数字,当前字符是字母,则添加下划线 if (is_digit(prev_char) && is_letter(c)) { output[j++] = '_'; } // 如果前一个字符是字母,当前字符是数字,则添加下划线 else if (is_letter(prev_char) && is_digit(c)) { output[j++] = '_'; } } // 添加当前字符到输出 output[j++] = c; prev_is_space = 0; } prev_char = c; } // 如果最后一个字符是空格,移除它 if (j > 0 && output[j-1] == ' ') { j--; } output[j] = '\0'; // 添加字符串结束符 // 输出结果 printf("%s\n", output); return 0; }

一.根据样例输入来解析上述代码:

该处理思路主要是,从原数组中提取元素,按照题目条件赋值到另一个数组中,最后只需要输出该数组output【】

主函数:

1.将完整单词的第一个改为大写,然后剩余单词字母全部赋值到output数组中

首先初始化表示单词首字母的标志变量in_word = 0;如果一开始(肯定是首字母)有字符是小写的不是大写的,此时就要调用字符判断函数,将小写字母转换成大写字母。之后就要将in_word转换成1,因为后面的就不是首字母了。但是在找到下一个首字母的时候,要将其再转换成0.同时,要将该字符即下一个字符的前一个字符prev_is_space=0.(是字符,不是空格)

因为一开始的字符肯定是该行字符的首字母,所以就要将其赋值给输出数组的第一个output[j],一开始定义j=0.之后不满足首字母的条件了,就要执行下面的else语句了。将后面的不需要变化的单词直接赋值给输出数组,j++;这些都是字符不是空格,所以prev_is_space = 0;一直到该完整单词结束,开始出现空格,如果空格很多,则想办法减少空格到一个。

2.将多个空格减少到只有一个空格。思路是:将检测到的一个空格赋给输出数组,然后开始将字母再赋给输出数组

只有整个单词结束后的第一个空格才是我们要找的空格,是赋给输出数组的空格,所以前一个必须是字符,不可能是空格,刚好有个标志变量prev_is_space 用来判断是否是空格,所以就用它来作为if条件语句的判断,并将这第一个空格赋给输出数组。同时不要忘了将标志变量prev_is_space转换成1.因为prev_is_space该变量有作用,所以在每一次赋值后面都要加上。

同时不要忘记标记空格不在完整的单词中,这样才能明白下一次就是完整单词的首字母了in_word然后就可以进行和上述一样的操作了,即给首字母大写,然后再重复进行即可.

3.之后就是在数字和字母之间加下划线。这时就要用到prev_char这个标志变量了,因为要确定前一个字符是数字,当前字符是字母,才可以加下划线。具体在上述代码中。

因为prev_char肯定不是0,所以也可以不用加上述if语句。

为什么要设置前一个字符为标志变量,而不是当前字符和后一个字符呢?

因为当前字符已将明确了,是if语句中的条件判断;同时,读取下一个字符的时候,当前字符为下一个字符的前一个字符,非常明确。而后一个字符还不知道,所以不能设后一个字符为标志变量。

因为根据题目要求,前一个字符和后一个字符有着密切的关系,根据这些关系来进行转换,运行,达到要求。这时就要设置前一个字符的标志变量。

二.我写代码的思路:

没有想到标志变量,(该题中,标志变量是关键)所以写的很麻烦,很混乱。很多一样的循环,并列用了很多次,这肯定不对。而且我写的代码不适用于任何情况,只适用于样例输入。因为没有标志变量,所以每次循环只能针对特定情况才能用。

因为我的思路是没有输出数组,还是原来数组,但是通过计算空格数将完整的单词通过赋值移到前面来,只保留一个空格。下一次再计算新的空格数,再将下一组单词移到前面来,所以一次循环只能处理一组单词,不能处理所有情况,而且非常麻烦。而且还有点小错误……🤭

#include<stdio.h> int main() { char input[81]; gets(81); int i; int count1=1; for(i=0;input[i]!='\0';i++){ if(input[i]==' '&&input[i+1]==' '){ count1++; } if(input[i]!=' '&&input[i+1]==' '){ break; } } for(i=0;input[i]!='\0';i++) if(i=0){ input[i]=input[i]+32; }else{ if((input[i]==' ')&&(input[i+1]>='a'&&input[i+1]<='z')){ input[i+1]=input[i+1]+32; } } } int j; for(i=0;input[i]!='\0';i++){ if(input[i]==' '&&input[i+1]==' '){ m=i; break; } } for(i=m;input[i+count1]!=' ';i++){ for(j=m;input[i]==input[j]&&input[i]!=' ';j++){ input[i-count1]=input[i]; input[i]=' '; //应该让该程序结束了,因为已经把一个完整的单词全移过去了 if(input[i+count1]==' '){ break; } } } int count2=1; for(i=m;input[i]!='\0';i++){ if(input[i]==' '&&input[i+1]==' '){ count2++; } if(input[i]!=' '&&input[i+1]==' '){ break; } } int n; for(i=m;input[i]!='\0';i++){ if(input[i]==' '&&input[i+1]==' '){ n=i; break; } } for(i=n;input[i+count2]!=' ';i++){ for(j=n;input[i]==input[j]&&input[i]!=' ';j++){ input[i-count2]=input[i]; input[i]=' '; if(input[i+count2]==' '){ break; } } } printf("%s",input); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 15:07:43

Swift-All API开发指南:云端测试环境随时启停

Swift-All API开发指南&#xff1a;云端测试环境随时启停 你是不是也遇到过这样的问题&#xff1f;作为一名全栈工程师&#xff0c;正在开发一个基于 Swift-All 框架的 API 接口&#xff0c;本地调试时总是卡顿、响应慢&#xff0c;甚至因为显存不足直接崩溃。更头疼的是&…

作者头像 李华
网站建设 2026/7/13 6:15:27

开源模型如何高效落地?Qwen单模型多任务实战

开源模型如何高效落地&#xff1f;Qwen单模型多任务实战 1. 引言&#xff1a;轻量级AI服务的工程挑战与破局思路 在边缘计算和资源受限场景中&#xff0c;大语言模型&#xff08;LLM&#xff09;的部署面临显存占用高、依赖复杂、响应延迟大等现实问题。传统做法是为不同任务…

作者头像 李华
网站建设 2026/6/26 11:38:29

POIKit:解决地理数据采集痛点的全能工具箱

POIKit&#xff1a;解决地理数据采集痛点的全能工具箱 【免费下载链接】AMapPoi POI搜索工具、地理编码工具 项目地址: https://gitcode.com/gh_mirrors/am/AMapPoi 还在为获取海量POI数据而烦恼吗&#xff1f;每次面对零散的地理信息需求&#xff0c;是否感到无从下手&…

作者头像 李华
网站建设 2026/7/5 6:18:40

NewBie-image-Exp0.1浮点数索引报错?已修复源码部署案例避坑指南

NewBie-image-Exp0.1浮点数索引报错&#xff1f;已修复源码部署案例避坑指南 1. 引言&#xff1a;为何选择NewBie-image-Exp0.1镜像 在当前生成式AI快速发展的背景下&#xff0c;高质量动漫图像生成已成为内容创作、艺术设计和研究实验的重要方向。然而&#xff0c;从零搭建如…

作者头像 李华
网站建设 2026/6/29 0:17:44

Cursor AI免费VIP终极指南:突破限制享受专业版功能

Cursor AI免费VIP终极指南&#xff1a;突破限制享受专业版功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial …

作者头像 李华
网站建设 2026/6/29 4:39:39

Qwen3-VL-2B技术实战:模型微调与领域适配指南

Qwen3-VL-2B技术实战&#xff1a;模型微调与领域适配指南 1. 引言&#xff1a;视觉语言模型的落地挑战 随着多模态人工智能的发展&#xff0c;视觉语言模型&#xff08;Vision-Language Model, VLM&#xff09;正逐步从研究走向实际应用。Qwen/Qwen3-VL-2B-Instruct 作为通义…

作者头像 李华