数组与字符串深度巩固

经过再三思考觉得今天就写一篇关于数组与字符串相关的文章吧!其中字符串主要通过练习来巩固知识亦或是获得新知识。好接下来将进行我们的学习时刻了。


首先我们来思考一个问题,你真的了解数组的数组名吗?数组名真的就单单一个名字而已吗?接下来我们慢慢探索。

数组名的真正意义

我们看一段代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int arr[10] = { 1,2,33,44,55,66,7,8,99,0 };int* p = arr;int* q = &arr;int* d = &arr[0];printf("%p\n", p);printf("%p\n", q);printf("%p\n", d);return 0;
}

 大家可以思考一下打印的结果会一样的吗?结果如下:

打印的结果是一样的,那这代表着什么呢?

其实数组的一个数组地址也可以用,数组首元素地址来代表,所以上述中  q 和 d 的打印结果一样我们可以理解,那数组名呢?难道说数组名也是代表整个数组的地址吗?


我们再看一段代码。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int arr[10] = { 1,2,33,44,55,66,7,8,99,0 };int* p = arr;int* q = &arr;int* d = &arr[0];printf("%d\n", sizeof(arr));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(arr[0]));return 0;
}

现在咋一看是不是又发现他们的有所不同的呢?他们的字节大小是不一样的。其中sizeof(arr[0])4个字节很好理解就是int类型的整形占4个字节,那sizeof(&arr)我们也容易弄明白,&arr就是一个地址嘛,地址的大小在64位机器下占8个字节,所以这里打印8,那为啥sizeof(arr)的结果为40呢?仔细一想40个字节不就是整个数组的字节大小嘛,所以这里arr代表的是整个数组。

结论: 其实在C语言中数组名,一般情况下确实可以认作数组首元素的地址,除了在sizeof(数组名)中代表整个数组。

竟然这样那我们以前写冒泡排序都是传数组名,形参也用数组形式来接收,那现在直到数组名代表首元素地址,那是否可以用指针形式来接收呢,答案是可以的。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>void Sort(int* p)
{int tem = 0;int i = 0;int j = 0;for (i = 0; i < 10; i++){for (j = 0; j < 10 - 1 - i; j++){if (*(p + j) > *(p + j + 1)){tem = *(p + j);*(p + j) = *(p + j + 1);*(p + j + 1) = tem;}}}}int main()
{int arr[10] = { 1,2,33,44,55,66,5,3,90,10 };Sort(arr);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 


数组与指针 

 我们看一段代码:

#include <stdio.h>
int main()
{char str1[] = "you are happy.";char str2[] = "you are happy.";char *str3 = "you are happy.";char *str4 = "you are happy.";if(str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0; 
}

仔细观察,你们觉得打印的结果又是怎样呢? 

是不是看到答案又是一头雾水呢?

这里就要讲到数组和指针的关系了,经过上面的结论,你是不是觉得好像数组和指针也没啥区别嘛,其实不然。在这里我们要知道,数组和指针是有区别的。数组就是数组,指针就是指针。在上面的代码中,其实str1和str2是两个不同的数组,所以他们进行判断str1是否等于str2时,也是比较首元素地址是否相等,从结果上看显然是不相等的,因为两个数组都在栈区中有着属于自己的空间。但str3和str4为什么相等呢,其实str3和str4这样子赋值,就是将字符”y“的首地址放入str3和str4中,但要注意的是此时的他们相当于一个字符常量,是属于代码块中的常量,所以str3和str4共同指向代码块中代表首字符”y“的地址,故 str3 等于 str4 . 


接下来就看一道数组题,巩固巩固吧。

写出一个杨辉三角形

毕竟练手,我这里就写了一个6行的杨辉三角。

#include  <stdio.h>
main()
{static int a[6][6];int i, j, k;for (i = 0; i < 6; i++){for (k = 0; k < 12 - 2 * i; k++)printf(" ");for (j = 0; j <= i; j++){if (j == 0 || j == i)a[i][j] = 1;elsea[i][j] = a[i - 1][j - 1] + a[i - 1][j];printf(" ");printf("%-3d", a[i][j]);}printf("\n");}
}

 思路:

我们都知道杨辉三角的两边都是1,所以我们在这里只要控制在i==就,和j等于0时,打印1即可,到后面我们根据杨辉三角的特性得出 a[i][j] = a[i - 1][j - 1] + a[i - 1][j];,就很容易写出来了,唯一需要注意的是打印前方的空格需要根据打印的行数而改变。


 字符串练习巩固

来看一道开胃菜

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

题目:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC


 首先通过审题这里判断两个字符串中的一个,是否由另一个通过旋转得到,那意思就是它旋转的字符个数我们也是不知道的,那就需要我们一一尝试出来了。下面是展示参考答案:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int Find(char* p, char* q,int n)
{int i = 0;int j = 0;char tem = 0;for (i = 0; i < n; i++){for (j = 0; j < n-1; j++){tem = p[j];p[j] = p[j + 1];p[j + 1] = tem;}if (strcmp(p, q)==0){return 1;}}return 0;}int main()
{char str1[] = "abcdefg";char str2[] = "cdefgab";char str3[] = "qwehhrl";char str4[] = "qwerrjl";if (Find(str1,str2,7)){printf("str2是str1通过旋转得到\n");}elseprintf("str2不是str1通过旋转得到\n");if (Find(str3,str4,7)){printf("str4是str3通过旋转得到\n");}elseprintf("str4不是str3通过旋转得到\n");return 0;
}

 

具体思路:

因为我们需要逐一排查第二个字符串是否是由第一个字符串旋转而来又或者旋转几位字符而来,所以我们的函数Find 中需要一个一个逐一去旋转,直到完成一次轮回,每旋转一次都对旋转后的p与q 进行比对是否是旋转得到。这里的 n 为 字符串中字符的个数-1(减去末尾的'\0') 。

如何得到旋转的字符串:

我们只需用辅助变量tem储存当前字符串中的第一个字符,然后将后面的字符往前推动一位,最后在最后一位在赋值为tem即可。


 接下来我们看一下最后一道题:

题目:编写一个程序,从键盘接收一个字符串,然后按照字符顺
序从小到大进行排序,并删除重复的字符。


这么一看你是否有那么一点思路了呢?

接下来我们直接参考一下答案:

#include <stdio.h>
#include <string.h>
void main()
{char str[100], * p, * q, * r, c;printf("输入字符串:");gets(str);for (p = str; *p; p++){for (q = r = p; *q; q++)if (*r > *q)r = q;if (r != p){c = *r;*r = *p;*p = c;}}for (p = str; *p; p++){for (q = p; *p == *q; q++);strcpy(p + 1, q);}printf("结果字符串:%s\n\n", str);
}

具体思路:首先我们创建一个数组和几个指针 ,数组用来接收键盘的字符串,其余指针用作辅助作用,首先代码前面我们进行字符排序,就简单的比较字符大小后通过辅助变量进行交换。后半代码则是删除掉重复的代码,这里需要进行两次循环,我们重p中一个一个字符进行排查,注意这里的第二个for循环后直接接 分号,只是让找出*p==*q时的地址,在通过库函数strcpy进行拷贝即可。


今天文章到此结束。

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

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

相关文章

父页面跨域获取iframe页面的值

跨域访问是指在一个域名的页面尝试访问另一个域名的资源。出于安全的考虑&#xff0c;浏览器实现了同源策略&#xff08;same-origin policy&#xff09;。这意味着&#xff0c;如果两个页面的协议、域名或端口有任何一个不相同&#xff0c;它们就不能直接访问对方的内容。但是…

Mac安装配置JDK

Mac安装配置jdk 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 下载jdk1.8及以上需要Oracle账号及密码 dokidoki811163.com\pass:Zywxmxbt1314… 安装jdk 双击安装包&#xff0c;点击.pkg&#xff0c;按照提示安装&#xff0c;配置环境之前…

【Linux】make和makefile详解

目录 一、概述 二、为什么要用makefile 三、创建简单的Makefile 四、makefile的规则 五、makfile的工作流程 六、makefile中声明变量 七、clean与伪目标 一、概述 当谈论到 Linux 中的软件构建工具时&#xff0c;不得不提到 Makefile。Makefile是一种文件&#xff0c;它…

微信小程序(二十八)网络请求数据进行列表渲染

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.GET请求的规范 2.数据赋值的方法 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item">&…

java 解析路径中的参数(与=拼接的参数)

百度找了好久&#xff0c;索性自己搞一个 废话不多说直接上代码 public class UrlParamAnalysis {/*** 解析出url请求的路径&#xff0c;包括页面* * param strURL url地址* return url路径*/public static String UrlPage(String strURL) {String strPage null;String[] ar…

科普类—— 大疆无人机(DJI)在解决图像传输延时问题策略(四)

大疆无人机&#xff08;DJI&#xff09;在解决图像传输延时问题方面采取了一系列技术和设计策略&#xff0c;以确保飞行过程中的实时图像传输和控制。以下是大疆无人机处理图像延时问题的一些关键方法&#xff1a; 专用通信协议&#xff1a;大疆无人机使用其自家开发的Lightbri…

介绍一个超好用的API管理工具:Apipost

Apipost是一款集API调试、生成文档、Mock、测试于一体的协同工具。单个工具可以同时满足接口测试、生成/分享文档、Mock、流程测试等功能&#xff0c;还有超实用的多人多角色间实时协作的功能。将前端、后端、测试三种角色串联起来&#xff0c;从而实现工作流程无缝衔接、提高研…

yolo系列多卡训练命令

yolo系列多卡训练 多卡训练命令示例 python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1参数 –batch&#xff1a;指定GPU一次处理的样本数量&#xff0c;即批量–data&#xff1a;指定描述训练和验证数据集位置&#xff0c;以及标签类别的配…

【Qt】—— 项⽬⽂件解析

目录 &#xff08;一&#xff09;.pro⽂件解析 &#xff08;二&#xff09;widget.h⽂件解析 &#xff08;三&#xff09;main.cpp⽂件解析 &#xff08;四&#xff09;widget.cpp⽂件解析 &#xff08;五&#xff09;widget.ui⽂件解析 &#xff08;一&#xff09;.pro⽂…

P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间&#xff0c;经常需要租借教室。大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。 面对海…

如何检验 MySQL 数据库中查询语句是否已经是最优,并进行优化

在MySQL数据库中&#xff0c;优化查询语句是提高数据库性能的关键。在这篇博客中&#xff0c;我们将详细介绍如何检验MySQL数据库中查询语句是否已经是最优的&#xff0c;并阐述如何进行优化查询以提高其效率。我们将涵盖以下几个方面的内容&#xff1a; 1、编写测试查询的脚本…

每周AI新闻(2024年第4周)OpenAI GPT降价增效,ChatGPT支持对话@GPTs | 通义千问Qwen-VL升级 | 哄哄模拟器爆火

我是陌小北&#xff0c;一个正在研究硅基生命的、有趣儿的碳基生命。每周日20:00&#xff0c;准时解读每周AI大事件。 本文解读部分属于陌小北的梦话&#xff0c;言论与她本人以及她所在的“陌北有棵树”账号无关。 大厂动向 【1】OpenAI GPT-3.5 Turbo降价增效、GPT-4 Turbo…

同态加密库Openfhe的介绍与安装

同态加密的基本概念 所谓的加密&#xff0c;其实是明文空间到密文空间的映射关系。明文空间里面的元素&#xff0c;叫做明文&#xff0c;是我们想要保护的信息&#xff0c;通常会含有一些特殊的信息。常见的明文有图像&#xff0c;视频、个人资料等等。明文空间里面的元素&…

net 一台路由器如何让两个不同网段的终端可以通信。

# 终端设备自己设置就行了 # 路由器的设置 The device is running! #################################################### <Huawei> Feb 1 2024 21:21:09-08:00 Huawei %%01IFPDT/4/IF_STATE(l)[0]:Interface GigabitEt hernet0/0/0 has turned into UP state. <…

C++层uevent获取

本文用的是#include <cutils/uevent.h> 主要讲述android中怎么在C层接收uevent uevent 是 kernel层向用户层发送的一个事件 首先创建一个线程用于循环去获取uevent void testUevent {//创建一个线程一直循环pthread_t thread;int ret pthread_create(&thread, nu…

Win11系统连接带HDMI接口的显示器后,电脑没有声音如何调试

解决这个问题的方法很简单&#xff0c;没有那么复杂。之所以使用HDMI接口连接了显示器后没声音&#xff0c;原因就是HDMI接口是包含音频视频两种信号的接口。当电脑的HDMI接口被使用时&#xff0c;系统就会默认从HDMI设备输出声音信号了&#xff0c;而此时如果HDMI设备没有声音…

取巧方式el-select单选重复选择

前言&#xff1a;之前产品是可以多选&#xff0c;我就一想在el-select 加个multiple不就完事了吗&#xff1f;我兴高采烈几分钟就实现了这个选择框&#xff0c;可是后面说单选也要重复多选几个&#xff0c;顿时我就****,又不想自己写个 首先安装element-plus 一定要安装2.5版本…

什么是模板方法模式?它的实现方式有哪些?

什么是模板方法模式&#xff1f;它的实现方式有哪些&#xff1f; 模板方法模式是一种行为型模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中实现&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

wespeaker项目grpc-java客户端开发

非常重要的原始参考资料&#xff1a; 链接: triton-inference-server/client github/grpc java ps&#xff1a; 使用grpc协议的其它项目python/go可以参考git hub目录client/tree/main/src/grpc_generated下的其它项目 其它链接&#xff1a; 想要系统了解triton-inference-ser…