数组(二)

本文深入探讨了一维数组在C语言中的应用,详细解析了sizeof(), strlen(), strcmp() 和 strncmp() 函数的功能与使用场景,包括计算数组大小、测量字符串长度、比较字符串以及安全的字符串比较方法。
    在学习一维数组的过程中,经常会用到一些简单的函数,在这里做一个简单的梳理。

sizeof()
sizeof()函数在C语言中用来计算对象的大小,获取的是字节,比如我们来看下面的例子:
#include<stdio.h>
main(){
int c[4]={1,3,5,7};//相当于c[4]={1,3,5,7};
printf(“数组占用了%d 个字节,一共有 %d 个元素\n”,sizeof©,sizeof(c[0]));
return 0;
}
该函数输出的结果是:数组共占用了16个字节,含有4个元素

strlen()
strlen()表示输入数组的长度,比如如下的例子:
#include<stdio.h>
#include<string.h>

				main(){
					char name[20];
					char len;
					
					printf("输入人的姓名:");
					fgets(name,sizeof(name),stdin);
					len=strlen(name);
					printf("输出姓名的长度:%d",len);
					
					return 0;
				}
     比如我在该程序中输入gong yu,该程序输出的结果是:输出姓名的长度: 8

不难理解,fgets()函数在输入时会带上结束符,所以加上空格,我的输出结果就是8了。

strcmp()
strcmp()是将两个字符串进行比较,比较的顺序是先从前往后比较,同序号的字符按ASCII码值进行比较,直到遇见对应字符不等或者字符串结束,如下:
int strcmp ( const char * str1, const char * str2 );
当str1<str2时:返回值<0
当str1>str2时:返回值>0
当str1str2时:返回值0

			#include<stdio.h>
			main(){
				char str1[32]="hello";
				char str2[32];
				int ret;
				
				printf("输入一个字符串:");
				gets(str2);
				ret=strcmp(str1,str2);
				printf("%d",ret);
				return 0;
				
			}

输出结果为:
在这里插入图片描述
通过以上三种情况便可以看出该用法,但是不难看出之前的一个问题,就是gets()函数本身会存在一个越界的问题,因此上述函数我们需要优化一下使用fgets()函数,如下:
#include<stdio.h>
#include<string.h>
main(){
char str1[32]=“hello”;
char str2[32];
int ret;

				printf("输入一个字符串:");
				fgets(str2,sizeof(str1),stdin);
				ret=strcmp(str1,str2);
				printf("%d",ret);
				return 0;
				
			}

输出的结果为:
在这里插入图片描述
结果却发现同样输入的hello,结果却是-1,这是为什么呢?这是因为我们上面讲过的fgets()函数会带入一个结束符造成的,要解决这个问题,我们只要限制我们输入字符的长度就好了,在输入过程中我们制定字符串的长度就可以有效的解决这个问题,这里就要引入一个新的函数strncmp().

strncmp()
该函数的用法如下:
int strncmp ( const char * str1, const char * str2, size_t num );
那么上面的函数可以改为:
#include<stdio.h>
#include<string.h>
main(){
char str1[32]=“hello”;
char str2[32];
int ret;

				printf("输入一个字符串:");
				fgets(str2,sizeof(str1),stdin);
				ret=strncmp(str1,str2,strlen(str1));
				printf("%d",ret);
				return 0;	
			}

在这里插入图片描述

### 数组指针与数组 数组指针一般与数组配合使用。例如定义一个数组指针`int (*p)[5]`,同时定义一个数组`int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}`,并将数组的地址赋给数组指针`p = a`。可以通过指针操作来访问数组元素,如`*(*(p+1))`、`*(*p+1)` 、`**p`等。当对指针`p`进行自增操作`p++`后,指针会指向下一个一维数组,此时指针的指向和对其解引用操作会发生相应变化 [^1]。 ### 指针数组 指针数组是一个数组数组中的每个元素都是指针。例如`int *p[5];`,它表示一个包含5个整型指针的数组。指针数组可用于指向多个一维数组,在处理多个字符串时很有用,例如`char *str[3] = {"hello", "world", "c"};`,这里的`str`就是一个指针数组,每个元素指向一个字符串常量 [^2]。 ### 用数组指针将一维数组拆分成数组 可以使用数组指针将一维数组拆分成数组。例如有一个一维数组`int arrary[] = {1, 2, 3, 4, 5, 6};`,可以定义一个数组指针`int(*p)[ROW] = (int(*)[]) &arrary;`,然后通过嵌套的`for`循环来访问拆分后的数组元素 [^3]。 ```c #include <stdio.h> #define LINE 3 #define ROW 2 int main() { int arrary[] = {1, 2, 3, 4, 5, 6}; int(*p)[ROW] = (int(*)[]) &arrary; int i, j; for (i = 0; i < LINE; i++) { for (j = 0; j < ROW; j++) { printf("%d\t", p[i][j]); } printf("\n"); } return 0; } ``` ### 指向指针的指针与数组 指向指针的指针可用来指向指针变量。定义`char **p;` ,表示一个指向字符串指针变量的指针变量;`int **p;` 表示一个指向整型指针变量的指针变量。`*(*p)` 表示指针变量`p`指向一个指针变量,`*p`是`p`所指向的指针变量。在处理数组时,指向指针的指针可以间接访问数组元素 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值