数组与字符串深度巩固

news2024/11/26 22:24:43

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


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

数组名的真正意义

我们看一段代码

#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");
  else
    printf("str1 and str2 are not same\n");

  if(str3 == str4)
    printf("str3 and str4 are same\n");
  else
    printf("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;
            else
                a[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");
    }
    else
        printf("str2不是str1通过旋转得到\n");

    if (Find(str3,str4,7))
    {
        printf("str4是str3通过旋转得到\n");

    }
    else
        printf("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.coloradmin.cn/o/1426043.html

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

相关文章

nodejs+vue+mysql校园失物招领网站38tp1

本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这两者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优化界…

【unity小技巧】unity3d创建和实现破碎打破物品,万物可破碎

文章目录 破碎插件可破碎的物品代码控制加入破坏力完结 破碎插件 关于物品破碎&#xff0c;其实之前已经分享过一个免费插件&#xff0c;如果没有碎片化的模型&#xff0c;可以选择使用这个插件&#xff1a; OpenFracture插件实现unity3d物体破裂和切割 可破碎的物品 代码控制…

zsh: command not found: mysql (mac通过安装MySQL后终端cmd找不到mysql命令)

考虑是mysql环境变量没有配置的问题 1.查找mysql安装路径 ps -ef|grep mysql 2.先启动上安装的mysql 3. 查看 .bash_profile 文件 ls -al 查看是否有(.bash_profile)文件 如果没有就输入以下命令创建一个&#xff0c;再查看 touch .bash_profile 4.打开 .bash_profile 文件 …

Spring的事件监听机制

这里写自定义目录标题 1. 概述&#xff08;重点&#xff09;2. ApplicationEventMulticaster2.1 SimpleApplicationEventMulticaster2.2 AbstractApplicationEventMulticaster 3. ApplicationListener3.1 注册监听器3.2 自定义 4. SpringApplicationRunListeners 1. 概述&#…

气膜厂家产品种类繁多,哪种适合您?

气膜是一种以薄膜为材料、通过气体充气而形成的充气结构。由于其轻便、灵活、耐用等优点&#xff0c;在各个领域都有广泛应用。气膜厂家生产的产品种类繁多&#xff0c;下面将介绍几种常见的气膜产品&#xff0c;并分析哪种适合您。 气膜建筑是气膜厂家的特色产品之一。气膜建…

探析零知识证明高能发展路径:走向更安全、私密且可扩展的 Web3 新时代

原文&#xff1a;https://www.coinbase.com/blog/understanding-the-zero-knowledge-landscape 作者&#xff1a;Jonathan King&#xff5c;Coinbase Ventures 编译&#xff1a;TinTinLand 本文核心观点 2023 年&#xff0c;零知识技术吸引了逾 4 亿美元的投资&#xff0c;主…

凝聚共识开新篇:产业“围炉谈”共促5G-A加速

由北京通信学会主办的“新阶段、新体验、新价值”产业围炉谈活动在北京时间1月25日已成功举办。 来自社会各界的专家代表齐聚一堂&#xff0c;围炉畅谈5G-A产业发展&#xff0c;共同呼吁5G-A产业加速&#xff0c;擘画数字发展新画卷。 承前启后&#xff0c;5G-A开启5G新阶段 …

MySQL索引的原理和SQL优化策略

1. 索引 在InnoDB存储引擎中&#xff0c;索引分为聚簇索引和辅助索引两种类型。 聚簇索引是指基于表的主键构建的索引&#xff0c;它决定了表中数据的物理存储顺序。也就是说&#xff0c;聚簇索引中的键值按照主键的顺序来排序&#xff0c;并且每个叶子节点存储的是整个表行的…

VBA技术资料MF113:将文件夹图像添加到PowerPoint

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

小程序跳转:云开发之h5跳小程序

背景&#xff1a; 抖音通过链接跳转微信小程序。考虑使用h5页面中转实现&#xff0c;下面是实现步骤。 官方的文档上面写的还是比较详细的&#xff0c;可以仔细阅读&#xff0c;按照步骤去操作。 实践总结&#xff1a; 测试必须使用真机测试&#xff0c;模拟器之类的全部不…

Spring实现事务(一)

Spring事务 .什么是事务事务的操作Spring中事务的实现准备工作创建表创建项目,引入Spring Web, Mybatis, mysql等依赖配置文件实体类 编程式事务(手动写代码操作事务)声明式事务(利用注解自动开启和提交事务) . 什么是事务 事务是⼀组操作的集合, 是⼀个不可分割的操作 在我们…

P9809 [SHOI2006] 作业 Homework 浅显易懂讲解这道题为什么根号分治

题目&#xff1a; 我们有一堆数&#xff0c;找出模Y的最小值。 思路&#xff1a; 我们初步思考&#xff0c;会发现每个Y是一段&#xff0c;比如 1~Y , Y~2Y , 2Y~3Y ... 每个区间都可能有最小的答案。 这里对Y可以使用根号分治&#xff0c;因为&#xff1a; 当Y足够大时&a…

MySQL原理(一)架构组成之物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用&#xff1a; 1.2、开启关闭&#xff1a; 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用&#xff1a; 2.2、开启关闭&#xff1a; 2.3、Binlog还有一些附加选项参数 &#xff08;1&#x…

8.4 Springboot整合Redis 之RedisTemplate方式

文章目录 前言一、Maven依赖二、配置文件application.properties2.1 连接池核心配置说明三、RedisTemplate配置类四、RedisTemplate工具类五、测试前言 上文我们讲解了官方推荐的Jedis方式,本文讲解Springboot通过Spring Data Redis 集成 Redis,主要使用RedisTemplate方式,…

LeetCode 使循环数组所有元素相等的最少秒数

地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 难度&#xff1a;中等 题目描述&#xff1a;给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每…

Java 类的加载流程

一、类的加载 指的是将类的.class 文件中的二进制 数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内&#xff0c;然后在堆区创 建一个 java.lang.Class 对象&#xff0c;用来封装类在方法区内的数据结构。 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内…

Android super.img解包和打包指南(含工具下载lpunpack、lpmake、lpdump)

本文所有命令均需要在linux 上执行 一、解包 1、将Android sparse image格式的super.img转成二进制文件 $ sudo apt install android-sdk-libsparse-utils $ simg2img super.img super.img.bin 2、下载工具lpunpack 和lpmake、lpdump 以及其依赖库 下载地址:https://downl…

进程控制(二)进程等待

文章目录 进程等待什么是进程等待&#xff1f;&#xff1f;&#xff1f;为什么要进行进程等待&#xff1f;&#xff1f;&#xff1f; 进程等待的方法wait函数waitpid函数 进程等待 什么是进程等待&#xff1f;&#xff1f;&#xff1f; 进程等待是通过wait/waitpid的方式&…

异或运算实现加密解密

异或运算符^&#xff0c;相同为0&#xff0c;不同为1&#xff08;同0非1&#xff09; 由异或运算法则可知&#xff1a;a ^ a 0&#xff0c;a ^ 0 a 如果c a ^ b&#xff0c;那么a b ^ c&#xff0c;即a ^ b ^ b a&#xff0c;^ 的逆运算仍然是 ^ 利用异或运算的性质&am…

python封装的.exe文件是如何在cmd中获取.xml路径的?

这段日子搞项目算法封装&#xff0c;愁死我。来回改了三遍&#xff0c;总算把相对路径、绝对路径&#xff0c;还有cmd给.exe传参的方式搞懂了。 主要是这个语句 workspace sys.argv[1] sys.argv[]的作用就是,在运行python文件的时候从外部输入参数往文件里面传递参数。 外部就…