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

字符移动问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—138. 随机链表的复制【中等】(cend函数)

2024每日刷题&#xff08;129&#xff09; Leetcode—138. 随机链表的复制 实现代码 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRan…

QT+多线程TCP服务器+进阶版

针对之前的服务器&#xff0c;如果子线程工作类里面需要使用socket发送消息&#xff0c;必须要使用信号与槽的方法&#xff0c; 先发送一个信号给父进程&#xff0c;父进程调用socket发送消息&#xff08;原因是QT防止父子进程抢夺同一资源&#xff0c;因此直接规定父子进程不能…

雷蛇笔记本数据丢失怎么恢复?提供详细指南

在数字化时代&#xff0c;笔记本电脑已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;尽管技术不断进步&#xff0c;数据丢失的风险仍然存在。雷蛇&#xff08;Razer&#xff09;作为一家知名的电脑硬件制造商&#xff0c;其笔记本电脑也难免会遇到这样的问题。当…

数学建模资料|历年数维杯数学建模竞赛真题及获奖论文汇总

2024年第九届数维杯大学生数学建模挑战赛:2024年5月10日08:00-5月13日09:00举行,为了更好的帮助参赛同学了解竞赛的赛制及赛题特点,数乐君今天给大家整理了历年数维杯国赛真题及优秀论文,方便同学们赛前巩固训练,掌握解题方法,提高获奖率。 2023年数维杯国赛真题(ABC题…

使用Maven对Java独立应用程序进行编译打包

一、 安装Maven 1.解压&#xff0c;移动安装包 sudo tar -zxf ~/apache-maven-3.9.6-bin.tar.gz -C /usr/local/ cd /usr/local/ sudo mv apache-maven-3.9.6/ ./maven-3.9.6 sudo chown -R qiangzi ./maven-3.9.6 二、Java应用程序代码 1.版本信息&#xff1a; Spark-2.1…

Python Flask框架(一)初识Flask

Flask是使用Python编写的Web微框架。Web框架可以使我们不用关心底层的请求响应处理&#xff0c;更方便高效的编写Web程序。Flask有两个主要依赖&#xff0c;一个是WSGI&#xff08;Web Server Gateway Interface&#xff0c;web服务器网关接口&#xff09;工具集&#xff0c;另…

ansible——INVENTORY主机清单

一、Inventory主机清单 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内 二、Inventory主机清单部署 2.1 前期准备 systemctl stop firewalld setenforce 0 yum install epel-release -y yum install…

Python实战点云并行化处理

LAS 及其压缩版本 LAZ 是用于存储点云信息的流行文件格式&#xff0c;通常由 LiDAR 技术生成。 LiDAR&#xff08;即光探测和测距&#xff09;是一种遥感技术&#xff0c;用于测量距离并创建物体和景观的高精度 3D 地图。存储的点云信息主要包括X、Y、Z坐标、强度、颜色、特征分…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

c++11 标准模板(STL)本地化库 - 平面类别(std::numpunct) - 定义数值标点规则

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义数值标点规则 std::numpunct template< class CharT >…

浅谈程序员的实用神器

作为一个程序员&#xff0c;有很多实用的工具和资源可以帮助我们提高工作效率和解决问题。以下是一些常用的程序员实用神器&#xff1a; 集成开发环境&#xff08;IDE&#xff09;&#xff1a;如Visual Studio Code、PyCharm、Eclipse等&#xff0c;提供代码编辑、调试、版本控…

APP 在华为应用市场上架 保姆级别详细流程

1、作为一名干开发的程序员&#xff0c;第一次能把自己的APP 上架&#xff0c;对自己来说是多么有意义的一项成就 2、创建一个 华为的开发者账号 根据提示填写完注册的信息https://developer.huawei.com/consumer/cn/product/华为开发者产品 | 开发者平台 | 流量变现 | 华为开…

虾皮商品详情页面的API接口与关键词搜索API接口

虾皮商品详情页面的API接口与关键词搜索API接口 在虾皮&#xff08;Shopee&#xff09;这样的电商平台中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色&#xff0c;它们为开发者提供了与虾皮平台数据交互的桥梁。本文将详细介绍虾皮商品详情页面的…

GreatSQL的sp中添加新的sp_instr引入的bug解析

GreatSQL的sp中添加新的sp_instr引入的bug解析 一、问题发现 在一次开发中用到的sp需要添加新的sp_instr以满足需求&#xff0c;但是添加了数个sp_instr以后发现执行新的sp会发生core。 注&#xff1a;本次使用的GreatSQL 8.0.32-25 1、sp_head.cc的init_sp_psi_keys()代码里…

阿贝云免费服务器推荐

由于近期毕设需要&#xff0c;需要将毕设上传到云服务器&#xff0c;届时答辩方便展示&#xff0c;找了很多云服务器提供商&#xff0c;发现都是需要抢或者其他要求的&#xff0c;无意中从一个知乎帖子中发现了阿贝云&#xff0c;号称永久免费&#xff0c;兴冲冲的开始免费适用…

网络补充笔记

目录 OSI 开放式系统互联参考模型 --- 7层参考模型 UDP&#xff1a;用户数据报文协议 --- 非面向不可靠的传输协议&#xff1b;传输层基本协议&#xff0c;仅完成传输层的基本工作 --- 分段、端口号 TCP&#xff1a;传输控制协议 --- 面向连接的可靠性传输协议 出了完成传输层…

Express初体验

介绍 Express是一个基于Node.js平台的极简、灵活的Web应用开发框架&#xff0c;官方地址&#xff1a;https://www.expressjs.com.cn/&#xff0c;简单来说&#xff0c;Express是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发Web应用&#xff08;HTTP…

提升Go语言数学运算能力:math包使用指南

提升Go语言数学运算能力&#xff1a;math包使用指南 介绍数学函数的使用基本数学运算幂和根的计算三角函数对数计算 特殊数学常数和函数数学常数超越数学函数错误处理和精度问题 高级应用实例统计数据的标准偏差计算利用三角函数解决实际问题 性能优化技巧避免不必要的函数调用…

机器学习——4.案例: 简单线性回归求解

案例目的 寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布&#xff0c;即对上面数据点进行拟合。 求解逻辑步骤 使用Sklearn生成数据集定义线性模型定义损失函数定义优化器定义模型训练方法&#xff08;正向传播、计算损失、反向传播、梯度清空&#…

计算机系列之数据结构

19、数据结构&#xff08;重点、考点&#xff09; 1、线性结构 线性结构&#xff1a;每个元素最多只有一个出度和一个入读&#xff0c;表现为一条线状。线性表按存储方式分为顺序表和链表。 1、顺序存储和链式存储 存储结构&#xff1a; 顺序存储&#xff1a;用一组地址连续…
最新文章