数组与字符串深度巩固

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


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

数组名的真正意义

我们看一段代码

#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,一经查实,立即删除!

相关文章

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;配置环境之前…

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

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

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

Apipost是一款集API调试、生成文档、Mock、测试于一体的协同工具。单个工具可以同时满足接口测试、生成/分享文档、Mock、流程测试等功能&#xff0c;还有超实用的多人多角色间实时协作的功能。将前端、后端、测试三种角色串联起来&#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;借教室的手续也不一样。 面对海…

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版本…

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…

【linux】运维-磁盘空间不足-用到的命令(简洁)

【linux】运维-磁盘空间不足-用到的命令 常用&#xff1a; 注&#xff1a;du -s 和 -d 不能同时都用, -s | -d n 注&#xff1a;df -H 和 -h 区别 -H 1K1000 -h 1K1024 #-T 显示文件系统类型 -h 高可读性显示 df -Th #-c显示总和 ;sort -r 倒序显示 ;2>/dev/nul…

小白初探|神经网络与深度学习

一、学习背景 由于工作的原因&#xff0c;需要开展人工智能相关的研究&#xff0c;虽然不用参与实际研发&#xff0c;但在项目实施过程中发现&#xff0c;人工智能的项目和普通程序开发项目不一样&#xff0c;门槛比较高&#xff0c;没有相关基础没法搞清楚人力、财力如何投入&…

Mask-Free Video Instance Segmentation

论文地址&#xff1a;[2303.15904] 无掩码视频实例分割 (arxiv.org) 论文代码&#xff1a;https://github.com/SysCV/MaskFreeVis 目录 一、摘要 二、介绍 三、方法 3.1 时间掩码一致性 3.2 时间KNN-patch Loss 3.3 训练MaskFreeVIS 四. 数据集 五.消融实验 六. 结果 七…

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展&#xff0c;当前的数据处理需求正以前所未有的规模增长&#xff0c;以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大&#xff0c;并对主机计算资源&#xff08;如内存和CPU&#xff09;造成极大负担&#xff0c;进…

Python网络爬虫分步走之 – 第一步:什么是网络爬虫?

Python网络爬虫分步走之第一步&#xff1a;什么是网络爬虫&#xff1f; Web Scraping in Python Step by Step – 1st Step, What is Web Crawler? By JacksonML 1. 什么是网络爬虫&#xff1f; 在能够使用Google搜索引擎的场合&#xff0c;你是否尝试过简单搜索&#xff…

【C++】类和对象万字详解

目录 一、类与对象 1、类是什么 二、类和对象的基础知识 2.1 定义类&#xff1a;成员变量和成员函数 2.2 创建对象&#xff1a;实例化一个类的对象。 2.3对象的生命周期&#xff1a;构造函数和析构函数。 a. 构造函数 b. 析构函数 c.小结&#xff1a; 三、成员变量和…

腾讯云雾锁王国游戏服务器上线,10秒钟快速搭建!

随着科技的飞速发展&#xff0c;游戏行业也迎来了前所未有的繁荣。在这个时代&#xff0c;玩家们对游戏的体验需求日益增长&#xff0c;对服务器的稳定性和速度要求也越来越高。为了满足市场需求&#xff0c;腾讯云推出了雾锁王国游戏联机服务器及一键部署方案&#xff0c;只需…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子&#xff08;coze&#xff09;的模型&#xff0c;字节基于chatgpt搭建的一个辅助生成AI的网站&#xff0c;感觉蛮有意思&#xff0c;看了掘金以后&#xff0c;于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

java之基础知识、零碎知识

MENU java学习路程之篇一、知识点、path环境变量、计算机发展史、数据的存储和运算、人机交互、计算机语言java学习路程之篇二、知识点、JAVA背景介绍、配置JAVA_HOME、跨平台、JVM、JRE、JDKjava学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA、开发工具jav…