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

news2024/11/24 15:50:36

字符移动问题

这道题的描述是这样的:输入一个字符串,将其中的数字字符移动到非数字字符之后,并保持数字字符和非数字字符输入时的顺序。例如:输入字符串“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.coloradmin.cn/o/1651634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制&#xff0c;以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统&#xff0c;不仅具有全球性、全…

命名空间、C++的输入输出、缺省参数(默认参数)、函数重载

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 为了生成一个给定数组 nums 的所有子集&#xff0c;我们可以利用一种称为回溯&#xff08;backtracking&#xff09;的算法…

java项目跑不起来 端口已被使用

背景 Springboot项目跑不起来&#xff0c;原因端口被占用。 解决方法 在 Windows 环境下&#xff0c;你可以按照以下步骤来查看某个端口被占用的情况&#xff0c;并停止相应的进程&#xff1a; 查看所有端口占用情况&#xff1a; 按下 Win R 键&#xff0c;打开运行窗口。…

【八十二】【算法分析与设计】2421. 好路径的数目,928. 尽量减少恶意软件的传播 II,并查集的应用,元素信息绑定下标一起排序,元素通过下标进行绑定

2421. 好路径的数目 给你一棵 n 个节点的树&#xff08;连通无向无环的图&#xff09;&#xff0c;节点编号从 0 到 n - 1 且恰好有 n - 1 条边。 给你一个长度为 n 下标从 0 开始的整数数组 vals &#xff0c;分别表示每个节点的值。同时给你一个二维整数数组 edges &#xff…

1262403-92-8,十三肽DOTA-LGEYGFQNALIVR,是一种具有特定氨基酸序列的多肽

一、试剂信息 名称&#xff1a;DOTA-Leu-Gly-Glu-Tyr-Gly-Phe-Gln-Asn-Ala-Leu-Ile-Val-Arg-COOHCAS号&#xff1a;1262403-92-8结构式&#xff1a; 二、试剂内容 DOTA-Leu-Gly-Glu-Tyr-Gly-Phe-Gln-Asn-Ala-Leu-Ile-Val-Arg-COOH是一种具有特定氨基酸序列的多肽&#xff…

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

探索大语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文本…

算法学习:数组 vs 链表

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3af; 引言&#x1f6e0;️ 内存基础什么是内存❓内存的工作原理 &#x1f3af; &#x1f4e6; 数组&#xff08;Array&#xff09;&#x1f4d6; 什么是数组&#x1f300; 数组的存储&#x1f4dd; 示例代码&#…

网页翻译终极方案:DeepLX

为什么要选择 DeepL 翻译&#xff1f; DeepL 被誉为全世界最精准的机器翻译&#xff0c;比最接近他们的竞争对手准确三倍以上 看看 DeepL 和 微软翻译 的对比 &#x1f447;&#x1f447; 三句英文: Walking on eggshells during the software update. Wangs VR game is a…

c#实现音乐的“vip播放功能”

文章目录 前言1. c#窗体2. 功能3. 具体实现3.1 添加文件3.2 音乐播放3.3 其他功能 4. 整体代码和窗口5. 依赖的第三方库 前言 最近在QQ音乐里重温周杰伦的歌&#xff0c;觉得好听到耳朵怀孕&#xff0c;兴起想要下载下来反复听&#xff0c;发现QQ音乐VIP歌曲下载下来的格式居然…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月8日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月8日 星期三 农历四月初一 1、 我国将对法国等12国免签政策延长至2025年底&#xff0c;旅游平台加码布局入境游。 2、 财政部&#xff1a;下拨1582亿元&#xff0c;提高义务教育阶段家庭经济困难学生补助标准。 3、 4月…

STM32窗口看门狗的操作

STM32的窗口看门狗的主要功能是&#xff0c;程序过早的喂狗还有太晚喂狗&#xff0c;都会触发单片机重启&#xff0c;就是有一个时间段&#xff0c;在这个时间段内喂狗才不会触发单片机重启。 下面我就总结一下窗口看门狗的设置过程&#xff1a; 第一步&#xff1a;开启窗口看…

车辆充电桩|基于Springboot+vue的车辆充电桩管理系统的设计与实现(源码+数据库+文档)

车辆充电桩管理系统 目录 基于Springboot&#xff0b;vue的车辆充电桩管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1 前台功能模块 4.1.1 首页功能 4.1.2 用户后台管理 2 后台功能模块 4.2.1 管理员功能 4.2.2 维修员功能 四、数据库设计 五、核…

菜鸡学习netty源码(四)—— EventLoopGroup

1.概述 我们前面进行过分析,channel为netty网络操作的抽象类,EventLoop负责处理注册到其上的Channel处理的I/O事件;EventLoopGroup是一个EventLoop的分组,它可以获取到一个或者多个的EventLoop对象。 2.类关系图 NioEventLoopGroup的类继承图,蓝色部分为对应的java类,绿…

jQuery-1.语法、选择器、节点操作

jQuery jQueryJavaScriptQuery&#xff0c;是一个JavaScript函数库&#xff0c;为编写JavaScript提供了更高效便捷的接口。 jQuery安装 去官网下载jQuery&#xff0c;1.x版本练习就够用 jQuery引用 <script src"lib/jquery-1.11.2.min.js"></script>…

【经验分享】做多年大数据采集的经验分享:关于电商API数据采集接口做电商必备的电商API接口

国内主流电商平台包括&#xff1a; 1. 淘宝&#xff1a;阿里巴巴旗下的电子商务平台&#xff0c;以C2C和B2C交易为主要业务模式。 2. 天猫&#xff1a;阿里巴巴旗下的B2C电子商务平台&#xff0c;为品牌商和零售商提供销售渠道和服务。 3. 京东&#xff1a;一家以B2C为主营业务…

Linux网络部分——部署YUM仓库及NFS共享服务

目录 一、yum仓库服务 1. 软件仓库的提供方式 2.如何构建并使用ftp软件仓库&#xff08;与本地yum源方法一致&#xff09; 3.如何搭建使用yum在线源&#xff1f; 4.yum软件包下载如何保存&#xff1f; 二、NFS共享存储服务 1.存储类型 2.提供共享存储的组合 3.NFS网络…

java+jsp+Oracle+Tomcat 记账管理系统论文(完整版)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…