计算最长字符串长度
输入n (n<10)个字符串,输出其中最长字符串的有效长度。要求自定义函数 Int max_len ( char *s[],int n),用于计算有n个元素的指针数组s中最长的字符串的长度。
法一:
思路:设置一个指针数组与一个二维数组,使指针数组指向二维数组
#include<stdio.h>
#include<string.h>
int max_len(char*s[],int n)
{
int i,j=0;
for(i=0;i<n;i++)
{
if(strlen(s[i])>strlen(s[j]))
{
j=i;
}
}
return strlen(s[j]);
}
int main()
{
int i,n;
char*s[10];
char a[10][10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
s[i]=a[i];
}
printf("%d",max_len(s,n));
}
法二:
思路:利用动态分配,malloc,只有一个指针数组
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int max_len(char*s[],int n)
{
int max=0;
int i;
for(i=0;i<n;i++)
{
if(strlen(s[max])<strlen(s[i]))
{
max=i;
}
}
return strlen(s[max]);
}
int main()
{
int n;
int i;
char*str[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
str[i]=(char*)malloc(sizeof(char)*10);/*这边本来想用strlen(str)+1的,不知道为什么会出错,用了这种方法,只能运行,但效率低下*/
scanf("%s",str[i]);
}
printf("%d\n",max_len(str,n));
return 0;
}
首先我们要知道char * str[10]是什么
这个语句代表创建了一个有10个元素的数组str,str中的每一个元素都是一个指针。
指针是什么?简单来说,指针就是地址,指针本身一般不存任何有实际意义的内容。举例:你在一个箱子里放了10000块钱,这钱你想让你朋友帮你去自助机器买东西,他不知道钱在哪里,所以你给他一张写着地址的纸条让他去拿,这个地址就是指针。
但是他能直接拿这个地址去买东西吗?自助机器只接受它设定里需要的东西,你能和这机器说这个地址有10000块钱,所以我把纸条给你,你给我10000块钱的商品,这可能吗?
也就是说必须让这个“地址”变得具有真正的“价值”,让它符合自助机器的设定,成为它眼中真正的货币。在这道题里,货币就是字符串。
指针不是字符串,但有两种方法让它具有字符串的意义。第一种方式创建了一个二维数组 a [10] [10] ,并且让s[i]=a[i],那么这时10个指针就是指向了10个字符串。当程序运行时,虽然表明上对指针进行判定,实际上判定的是指针指向的内容——10个字符串。
第二种方法里没有设置别的字符串,那么就必须让指针本身就作为真正的字符串。在某种意义上,你可以把str[i]=(char*)malloc(sizeof(char)*10)当做是一维数组升维到二维数组的操作.
(char*)malloc(sizeof(char))就是给指针申请真正用来存储的空间,默认是一个char字符大小
(char*)malloc(sizeof(char)*10)给指针申请10个char类型大小的空间。
我们一般把一开始就分配空间的方式,如char*str[10]定义为静态分配。
而把str[i]=(char*)malloc(sizeof(char)*10)这种在str已定义后从堆空间中分配又分配的叫做动态分配
注意,上述说法问题很大,只是方便你快速理解。
现在你应该清楚了,在利用str[i]=(char*)malloc(sizeof(char)*10)把指针升维后,str已经从一维数组变成了二维数组,也就是说它具有了真正存放空间的能力,你随手写的纸条变成了具备法律效力的可以被机器识别的万元支票。乘10代表10个char大小,不管是类型还是大小都是根据你程序的需求而定的,char可以改成int,long等数据类型,10也可以改成别的数字。