数据结构(C语言):两个字符串比较大小

news2024/11/15 21:55:23

一、一个小插曲

在写这篇文章之前,作者想先和大家分享一个小故事。如果你不想看这个小故事的话,可以直接跳到第二点哦。

为了锻炼自己的编码能力,平时作业和实验题的代码我都是不看书、不看老师的PPT,按照自己的思路一行一行敲出来的。同时也不太理解那些照着书敲代码的同学。直到有一天,我看见我的数据结构作业字符串大小比较的函数被打上了一把大大的红叉,我一开始很不理解:我的代码在编译器上成功运行了,没问题呀!一定是老师改错了。

我当初写的代码是这样的,思路是:先比较串长,字符串越长越大。若串长一致,再依次比较各个字符的ASCII码,ASCII码大的串越大。所以写出来的函数是这样的。

Status StringCompare1(String* S, String* T)//返回值为1,表示S>T;返回值为0,代表S=T;返回值为-1,代表S<T
{
	if (S->len > T->len)//串长S>T
		return 1;
	else if (S->len < T->len)//串长S<T
		return -1;
	else//若串长一致,则分别比较相应字符的ASCII
	{
		for (int i = 0; i < S->len; i++)
		{
			if (S->data[i] > T->data[i])
				return 1;
			else if (S->data[i] < T->data[i])
				return -1;
		}
		return 0;//若循环跳出,则说明两个字符串完全相同
	}
}

又过了好几个星期(也就是今天),我打算写一篇字符串大小比较的函数,因为是要发出来给大家看的,所以我必须保证内容的正确性,于是我在CSDN上搜了几篇关于字符串大小比较的博客,才发现我当初是错得多么离谱。

也是近段时间才明白:不能太忽视书本和教学PPT,要先熟悉掌握经典的算法思路,再去自己敲代码,否则,完全凭自己的思路,算法往往不是最优的,甚至有可能是错的。像这样的坑,其实我已经跳了不止一次,今天分享的这个故事只是其中的一个。以后要好好改进这点了,先把基础打牢,再去“发明创造”。

二、算法思路及代码

字符串的大小是从最左边第一个字符开始比较,大者为大,小者为小,若相等,则继续比较后面的字符。

话不多说上代码:

首先是头文件、宏定义及结构体等

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define ERROR 0
#define OK 1
#define MAX_SIZE 21//多留出一位储存'\n'

typedef struct String {
	char* data;
	int len;
};

其次是串的大小比较函数

Status StringCompare(String* S, String* T)//返回值为1,表示S>T;返回值为0,代表S=T;返回值为-1,代表S<T
{
	for (int i = 0; S->data[i] && T->data[i]; i++)
	{
		if (S->data[i] > T->data[i])//分别比较对应字符的ASCII
			return 1;
		else if(S->data[i] < T->data[i])//分别比较对应字符的ASCII
			return -1;
	}
	return 0;//若循环跳出,说明两个字符串大小相等
}

为了测试函数的正确性,我们需要再定义串的初始化函数、输入函数以及主函数。

串的初始化函数

void InitString(String* s)//初始化
{
	s->data = (char*)malloc(sizeof(char)*MAX_SIZE);
	s->len = 0;
}

串的输入函数

Status Input(String* s)//添加元素
{
	int n;
	printf("输入需要加入的元素个数:");
	scanf("%d", &n);//输入需要加入的元素个数
	getchar();//吸收上一次输入的'\n'
	printf("输入字符串:");
	for (int i = s->len; i <= n; i++)//i<=n因为最后还要输入'\n'代表输入完成
	{
		s->data[i] = getchar();
		s->len++;
		if (s->len == MAX_SIZE-1)//每一次输入后,判断串是否已满(因为结尾有'\n',所以MAX_SIZE-1就认为数组已满)
			return ERROR;
	}
	s->len--;//除去结尾的'\n'
	return OK;
}

主函数

int main()
{
	String* S = (String*)malloc(sizeof(String));
	InitString(S);//初始化
	Input(S);
	String* T = (String*)malloc(sizeof(String));
	InitString(T);//初始化
	Input(T);
	if (StringCompare(S, T) == 1)
		printf("S>T");
	else if (StringCompare(S, T) == 0)
		printf("S=T");
	else
		printf("S<T");
	return 0;
}

所有代码放一起运行,就能得到最终的运行结果了,这里放一个运行示例,其他的你们自己去试吧。

运行结果

 

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

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

相关文章

【STM32CubeMX】F103RTC时钟

前言 本文记录了我学习STM32CubeMX的过程&#xff0c;方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了RTC时钟的基础配置。下文调试时用到的串口来查看&#xff0c;不过串口的配置省略了。 步骤 实验目标&#xff1a;基于RTC时钟&#xff0c;查看它的秒计时…

Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

文章目录 第一步 M1芯片安装Pytorch环境安装Miniforge创建虚拟环境安装Pytorch 第二步 下载李沐Jupyter文件第三步 配置vscode参考 第一步 M1芯片安装Pytorch环境 安装Miniforge Mac打开终端&#xff08;Mac电脑如何启动终端&#xff1f;打开启动台&#xff0c;搜索终端即可&…

网络安全合规-数据分类分级标准汇编

今天主要学习讲解的是网络安全合规-数据分类分级标准汇编。 作为数据安全治理的前期首要工作-分类分级&#xff0c;而分类分级的开展工作又是根据相关标准开展的&#xff0c;建立数据安全防护体系的第一步就是梳理数据资产进行分类分级。只有做好分类分级工作&#xff0c;对不同…

迈向多模态AGI之开放世界目标检测 | 人工智能

作者&#xff1a;王斌 谢春宇 冷大炜 引言 目标检测是计算机视觉中的一个非常重要的基础任务&#xff0c;与常见的的图像分类/识别任务不同&#xff0c;目标检测需要模型在给出目标的类别之上&#xff0c;进一步给出目标的位置和大小信息&#xff0c;在CV三大任务&#xff08;识…

GIMP制作艺术字技巧

GIMP下载官网 https://www.gimp.org/downloads/ 我使用的版本 2.10.32 字体下载 https://ziyouziti.com/index-index-all.html 下载解压之后会有otf、ttf等字体文件&#xff0c;需要拷贝到gimp当前用户目录 C:\Users\用户名\AppData\Roaming\GIMP\2.10\fonts GIMP绘制字…

分布式医疗云平台【项目简介、适合对象、技术选型、项目的核心功能模块 、模块设计及功能演示】(一)-全面详解(学习总结---从入门到深化)

目录 分布式医疗云平台 一、项目简介 二、适合对象 三、技术选型 四、项目的核心功能模块 五、项目特色 六、模块设计及功能演示 分布式医疗云平台 一、项目简介 分布式医疗云平台系统是以完整的基层医疗机构信息化解决方案为出发点&#xff0c;打造链接诊所、医生、…

【P7】JMeter 计数器

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 配置元件 <<< 计数器 Starting value&#xff1a;1 递增&#xff1a;1 Maximum value&#xff1a;9999 数字格式&#xff1a;var_0000 引用名称&#xff1a;var &#xff08;2&#xf…

web集群,部署jpress应用

1.静态网页与动态网页的区别 静态网页&#xff1a; &#xff08;1&#xff09;请求响应信息&#xff0c;发送给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示页面称为静态页面。在网站设计中&#xff0c;纯粹html格式的网页&#xff08;包含图片&#xff0c;视…

學習日記,java与写题目

开篇来个每日一题 1419. 数青蛙 难度中等185收藏分享切换为英文接收动态反馈 给你一个字符串 croakOfFrogs&#xff0c;它表示不同青蛙发出的蛙鸣声&#xff08;字符串 "croak" &#xff09;的组合。由于同一时间可以有多只青蛙呱呱作响&#xff0c;所以 croakOfF…

冯诺依曼+OS+进程+进程状态

索引 一.冯诺依曼理解二.OS 进程的初步认识1.什么是进程&#xff1f;2.如何查看进程3.父进程与子进程4.进程状态1.S阻塞态R运行态2.D阻塞&#xff08;不可中断&#xff09;3.Z僵尸状态andX死亡状态4.孤儿进程5&#xff0c;进程死亡之后OS做了什么五.状态总结&#xff1a; 一.冯…

数据库系统工程师 —— 第六章 数据库技术基础

文章目录 &#x1f4c2; 第六章、数据库技术基础 &#x1f4c1; 6.1 基本概念 &#x1f4d6; 6.1.1 数据库与数据库管理系统 &#x1f4d6; 6.1.2 数据库技术的发展 &#x1f4d6; 6.1.3 DBMS的功能和特点 &#x1f4d6; 6.1.4 数据库系统的体系结构 &#x1f4d6; 6.1.5 数据库…

极致鸿蒙——华为MatePad系列安装AidLux,一个自带vscode的Python编译环境

看着刚刚人入手的华为鸿蒙系统MatePad11平板&#xff0c;是如此的美轮美奂&#xff0c;但是总感觉少了点什么&#xff0c;少了点什么呢&#xff1f;是编程环境&#xff0c;我爱MatePad&#xff0c;也爱编程&#xff0c;那如果可以在MatePad上编程&#xff0c;会发生什么&#x…

Ae:3D 变换小工具与 3D 轴模式

◆ ◆ ◆ 3D 变换小工具 3D 变换小工具 3D Gizmo是用不同颜色标志的直观的调整工具&#xff0c;可用来缩放、定位和旋转 3D 图层、摄像机图层和灯光图层。 如上图所示&#xff0c;不同的颜色表示不同的轴。红色表示 X 轴&#xff0c;绿色表示 Y 轴&#xff0c;蓝色表示 Z 轴。…

有趣的 Kotlin 0x15:data object

简介 Kotlin 早在 1.7.20版本就引入了一种新的对象声明类型&#xff1a;data object&#xff0c;但是处于Experimental 阶段 。data object 与常规object 在概念上表现一致&#xff0c;但带有开箱即用且语义清晰的 toString 函数。而在 1.8.20 版本&#xff0c;data class 的语…

webstorm 创建harthat项目

Getting started with Hardhat | Ethereum development environment for professionals by Nomic FoundationGetting started with Hardhathttps://hardhat.org/hardhat-runner/docs/getting-started#quick-start安装环境 npm install --save-dev hardhat 创建项目 npx hard…

基数树RadixTree

转自&#xff1a;基数树RadixTree - 知乎 1. 基数树概述 对于长整型数据的映射&#xff0c;如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找&#xff0c;能快速且节省空间地完成映射。借助于Radix树&#xff0c;我们可以实现…

IntelliJ IDEA Run时报“无效的源发行版:16“错误

在新建Java项目时&#xff0c;run运行main方法时&#xff0c;报错 “java: 错误: 无效的源发行版&#xff1a;16”&#xff0c;了解一番后原来自己创建项目时&#xff0c;Project language level 没有和Project SDK版本相匹配。 还原创建项目步骤&#xff1a; 一、创建项目 …

Python语音增强

img { margin: auto; display: block } 简介 音频时域波形具有以下特征&#xff1a;音调&#xff0c;响度&#xff0c;质量。我们在进行数据增强时&#xff0c;最好只做一些小改动&#xff0c;使得增强数据和源数据存在较小差异即可&#xff0c;切记不能改变原有数据的结构&…

3.0 响应式系统的设计与实现

1、Proxy代理对象 Proxy用于对一个普通对象代理&#xff0c;实现对象的拦截和自定义&#xff0c;如拦截其赋值、枚举、函数调用等。里面包含了很多组捕获器&#xff08;trap&#xff09;&#xff0c;在代理对象执行相应的操作时捕获&#xff0c;然后在内部实现自定义。 const…

将PDF文件转换为JPG格式图片的3种简单方法

如何在线将PDF文件转换成图片格式&#xff1f;如果您在使用PDF文件时只需要其中一页或几页的内容&#xff0c;将PDF转换为图片可以使您更方便地使用这些内容。下面介绍三种简单易用的PDF转图片的方法。 方法一&#xff1a;记灵在线工具 记灵在线工具是一个免费的在线PDF转换工…