机试:字符串相关简单问题

字符移动问题

这道题的描述是这样的:输入一个字符串,将其中的数字字符移动到非数字字符之后,并保持数字字符和非数字字符输入时的顺序。例如:输入字符串“ab4f35gr#a6”,输出为“abfgr#a4356”。

以下使我试着敲的代码,思路很简单,遍历两遍字符串,第一遍把非数字的排好,第二遍再把数字排好。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[100];char temp[100];gets(str);int len=strlen(str);int i=0,q=0;while(q<len){if(str[q]>'9'&&str[q]<'0'){temp[i++]=str[q];}q++;}q=0;while(q<len){if(str[q]<='9'&&str[q]>='0')temp[i++]=str[q];q++;}puts(temp);return 0;}

但是这段代码运行结果并不令我满意:

 

查询发现我犯了一个严重错误:

字符范围判断错误:条件str[q] > '9' && str[q] < '0'是逻辑上不可能的,因为在ASCII码中,'0'到'9'之间没有其他字符,因此这个条件永远不会为真。这意味着第一个while循环实际上不会把任何字符放进temp

因此作出修改:

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[100];char temp[100];gets(str);int len=strlen(str);int i=0,q=0;while(q<len){if(str[q]>'9'||str[q]<'0'){temp[i++]=str[q];}q++;}q=0;while(q<len){if(str[q]<='9'&&str[q]>='0')temp[i++]=str[q];q++;}for(i=0;i<len;i++){printf("%c",temp[i]);}printf("\n");return 0;}

这样就可以了。同时做出的更改还有将输出字符串从puts()函数改成了printf()函数,原因是就算结果是正确的,我所输出的结果后还跟着一长串‘烫’字,不知道什么原因。。。

查询得到有可能是因为:

初始化与结尾处理:由于字符数组temp没有被明确地终止,因此在输出时可能包含未初始化的字符,导致出现乱码。

尝试改回去,在temp数组末尾加‘\0’。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[100];char temp[100];gets(str);int len=strlen(str);int i=0,q=0;while(q<len){if(str[q]>'9'||str[q]<'0'){temp[i++]=str[q];}q++;}q=0;while(q<len){if(str[q]<='9'&&str[q]>='0')temp[i++]=str[q];q++;}temp[i]='\0';puts(temp);return 0;}

这样也是正确的。

字母统计问题

题目描述:输入一行字符串,计算其中A-Z大写字母出现的次数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[100];int len;int i;char c;while(scanf("%s",str)!=EOF){len=strlen(str);int count[26]={0};for(i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z')count[str[i]-'A']++;}for(i=0,c='A';c<='Z';c++){printf("%c:%d\n",c,count[i++]);}}return 0;}

首字母大写问题

题目描述:对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。 在字符串中,单词之间通过空白符分隔,空白符包括:空格(' ')、制表符('\t')、回车符('\r')、换行符('\n')。

真的会被字符串的题的细节坑到。。。

上代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[100];int len;int i;char c;while(scanf("%s",str)!=EOF){len=strlen(str);c=' ';for(i=0;i<len;i++){if(c==' '||c=='\t'||c=='\n'||c=='\r'){if(str[i]<='z'&&str[i]>='a'){str[i]=str[i]-'a'+'A';}}c=str[i];}puts(str);/*for(i=0;i<len;i++){printf("%c",str[i]);}printf("\n");*/}return 0;
}

给看一下这段代码的运行结果:

是的,它把每一个空格隔开的字符串当成完全独立的字符串了o(╥﹏╥)o

搜索得知:

在C语言中,使用fgets函数可以安全地读取带有空格的字符串,并且你可以指定一个最大的字符数来防止缓冲区溢出。此外,可以检查字符串中是否包含换行符来确定用户是否按下了回车键。

char *fgets(char *str, int n, FILE *stream);

fgets 是 C 语言中用于从指定的输入流读取字符串的函数。常用来读取标准输入 (stdin) 或从文件读取数据。

这里解释一下每个参数的含义:

  • str:指向一个字符数组的指针,这个数组用于存储从输入流读取的字符串。这个数组应该足够大,以存储读取到的字符串以及字符串终止符 \0

  • n:要读取的最大字符数(包括字符串终止符 \0)。fgets 最多会读取 n-1 个字符,并且会在末尾加上一个字符串终止符。这样做是为了确保读取的字符串是正确终止的。

  • stream:指定要读取的输入流。在读取标准输入时,这个参数是 stdin,也可以是指向文件流的指针,用于从文件读取数据。

在读取字符串后,fgets 会返回 str,如果遇到错误或到达文件末尾,则返回 NULL

完整可运行代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[105];int len;int i;char c;while(fgets(str, sizeof(str), stdin) != NULL){len=strlen(str);str[--len]='\0';//清除掉末尾'\0'前的回车符'\r'c=' ';for(i=0;i<len;i++){if(c==' '||c=='\t'||c=='\n'||c=='\r'){if(str[i]<='z'&&str[i]>='a'){str[i]=str[i]-'a'+'A';}}c=str[i];}puts(str);}return 0;
}

统计单词的问题

题目描述:编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。 (凡是以一个或多个空格隔开的部分就为一个单词)

不知道为什么,这段代码可以在牛客上运行成功,但在n诺上不行:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[105];int len;int i, count;char c;while (fgets(str, sizeof(str), stdin) != NULL) {len = strlen(str);str[--len] = '\0'; //清除掉末尾'\0'前的回车符'\r'i = 0;c = ' ';while (i < len) {count = 0;c = str[i];while ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) {count++;c = str[i];i++;}if ((str[i] == ' ' || str[i] == '.') && c != ' ')printf("%d ", count);i++;}printf("\n");}return 0;
}

又研究了一下,发现n诺上的代码测试中有的样例没有在句子后面加‘.’,因此这段代码才会出错,只需修改一行就行了:

if((str[i]==' '||str[i]=='.'||str[i]=='\0')&&c!=' ')printf("%d ",count);

删除字符串问题

题目描述:

给你一个字符串S,要求你将字符串中出现的所有"gzu"(不区分大小写)子串删除,输出删除之后的S。

就是说出现“Gzu”、“GZU”、“GZu”、"gzU"都可以删除。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char str[105];char temp[105];int len;int i,count;char c;while(fgets(str, sizeof(str), stdin) != NULL){len=strlen(str);count=0;str[--len]='\0';//清除掉末尾'\0'前的回车符'\r'for(i=0;i<len;){if((str[i]=='g'||str[i]=='G')&&(str[i+1]=='z'||str[i+1]=='Z')&&(str[i+2]=='u'||str[i+2]=='U')){i+=3;continue;}temp[count++]=str[i++];}temp[count]='\0';puts(temp);}return 0;
}

这里的字符串问题都比较简单,没有牵扯较难的算法。在机试当中,很多时候都会考到字符串相关的问题,尤其是查找和删除。之后我会学习解决更多关于字符串的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/705105.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STK中的光照计算模型

本文简要阐述STK中光照计算的模型。 在航天任务中&#xff0c;通常需要分析地面站、飞行器在一定时间内的光照情况&#xff0c;具体包括&#xff1a; 地面站处在光照区和阴影区的具体时间范围&#xff1b;考虑地形遮挡后&#xff0c;地面站的光照区和阴影区的变化情况&#x…

SketchUp Pro 2024 mac草图大师 激活版 专业的3D建模软件

对于追求专业、高效的设计师们来说&#xff0c;SketchUp Pro 2024 for Mac无疑是最佳的选择。它提供了线条、形状、曲线、文本和图像等多种建模元素&#xff0c;让您能够根据需求自由创作。同时&#xff0c;软件还支持智能标注和尺寸功能&#xff0c;让建模过程更加精确、高效。…

加盟商小程序运用线上渠道的作用是什么

很多行业都有头部品牌&#xff0c;为了满足市场需要和品牌发展、提升营收&#xff0c;加盟模式很常见&#xff0c;通过不断宣传/品牌影响力&#xff0c;获得更多有意向的人&#xff0c;而有意向的用户也需要找到靠谱的品牌及清晰流程等。 在【雨科】平台可制作加盟商信息服务展…

通俗易懂讲乐观锁与悲观锁

浅谈乐观锁与悲观锁 乐观锁和悲观锁是Java并发编程中的两个概念。使用乐观锁和悲观锁可以解决并发编程中数据不一致性、死锁、性能差等问题&#xff0c;乐观锁与悲观锁的实行方式不同&#xff0c;所以其特性也不近相同&#xff0c;下文将详细介绍两者的特性与适用场景。 《熊…

MinIO学习笔记

MinIO学习笔记 MinIO简介Springboot整合MinioMinIO中的Bucket、ObjectMinioClient的常用API&#xff1a;操作bucketMinioClient的常用API&#xff1a;操作对象 MinIO集群部署纠删码模式部署单机多磁盘的纠删码模式部署分布式集群部署 Nginx 视频学习地址 MinIO简介 MINIO干什…

机器人非线性系统反馈线性化与解耦

机器人非线性系统的反馈线性化和解耦是控制理论中的两个重要概念&#xff0c;它们分别用于简化系统分析和设计过程&#xff0c;提高控制系统的性能。 首先&#xff0c;反馈线性化是一种将非线性系统转化为线性系统的技术。在机器人控制中&#xff0c;由于机器人本身是一个强耦…

什么是最大路径?什么是极大路径?

最近学习中&#xff0c;在这两个概念上出现了混淆&#xff0c;导致了一些误解&#xff0c;在此厘清。 最大路径 在一个简单图G中&#xff0c;u、v之间的距离 d ( u , v ) min ⁡ { u 到 v 的最短路的长度 } d(u,v) \min \{ u到v的最短路的长度 \} d(u,v)min{u到v的最短路的…

20231911 2023-2024-2 《网络攻防实践》实践九报告

1.实践内容 1.1 缓冲区 缓冲区是内存空间的一部分&#xff0c;在内存中预留了一定的存储空间&#xff0c;用来暂时保存输入和输出等I/O操作的一些数据&#xff0c;这些预留的空间就叫做缓冲区。 1.2 shellcode shellcode是一段用于利用软件漏洞而执行的代码&#xff0c;也可以…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 数三角

//枚举顶点。 //不存在等边三角形 #include<bits/stdc.h> using namespace std; #define int long long const int n2e311; int a,b,c,l[n],r[n]; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a;for(int i1;i<a;i){cin>>…

【初阶数据结构】带头双向循环链表讲解

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录与初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

开源连锁收银系统哪个好

针对开源连锁收银系统的选择&#xff0c;商淘云是一个备受关注的候选。商淘云以其功能丰富、易于定制和稳定性等优势&#xff0c;吸引了众多企业和开发者的关注。下面将从四个方面探讨商淘云开源连锁收银系统的优势&#xff1a; 首先&#xff0c;商淘云提供了丰富的功能模块。作…

报错:(idea端口被占用)Web server failed to start. Port 9090 was already in use.

cmd里面输入&#xff1a; netstat -ano|findstr "9090" 可以看到pid是9644 然后再打开任务管理器