还是通过一个编程的例子来介绍函数返回多个值的应用。
举例:编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串并打印出来,该字符串是由同一字符组成的。
分析:这个字符串是存放在字符数组里的,要打印出来这个最长的字符串,就要知道最长子字符串的字符组成及其长度,也就是说,如果写一个函数实现这个功能,函数就得返回这样两个值,即字符和其长度。
方法一:定义全局变量。
通过把我们想要知道的字符和长度定义为全局变量,然后在函数中通过比较和计算找到这两个值,并将其赋值给我们定义的全局变量即可,函数虽然没有返回值,但是全局变量的值已经改变了。
定义全局变量实现的代码如下。
#include <stdio.h>
int max;
char c;
void ChildString(char *p)
{
int stringlen=0,len=1,maxlen=1;
int i=0,j=1;
char *q;
q = p;
while(*q!='\0')
{
stringlen++; //统计字符串长度
q++;
}
while(i < stringlen)
{
if(*(p+i)==*(p+j) && j < stringlen)
{
len++; //统计子串长度
}
else
{
if(len > maxlen) //统计最大子串长度
{
maxlen = len;
c = *(p+i);
}
len = 1;
}
i++;
j++;
}
max = maxlen;
}
void main()
{
char a[100];
printf("Please input a string: \n");
gets(a);
ChildString(a);
printf("The longest child string is : \n");
for(int i = 0; i < max; i++)
printf("%c",c);
printf("\n");
}
方法二:返回静态指针。
通过定义一个静态数据,将需要的两个值存放进来,由于需要的两个值一个是整型一个是字符型,因此需要将其中的一个进行转换存放,相对来说比较麻烦,但是如果是相同类型的值,这个方法还是比较好的。
当然也可以将这个静态数组定义为全局变量,结果是一样的。
定义静态指针实现的代码如下。
#include <stdio.h>
//int a[2];
int *ChildString(char *p)
{
int stringlen=0,len=1,maxlen=1;
int i=0,j=1;
static int a[2]; //函数执行结束时不被释放
char c;
char *q;
q = p;
while(*q!='\0')
{
stringlen++; //统计字符串长度
q++;
}
while(i < stringlen)
{
if(*(p+i)==*(p+j) && j < stringlen)
{
len++; //统计子串长度
}
else
{
if(len > maxlen) //统计最大子串长度
{
maxlen = len;
c = *(p+i);
}
len = 1;
}
i++;
j++;
}
a[0] = c-'0';
a[1] = maxlen;
return a;
}
void main()
{
char a[100];
printf("Please input a string: \n");
gets(a);
int *p;
p = ChildString(a);
printf("The longest child string is : \n");
for(int i = 0; i < *(p+1); i++)
printf("%c",*p+'0');
printf("\n");
}
方法三:定义结构体。
通过定义结构体存放不同类型的变量,在需要返回很多个值时,定义结构体这种方法的优势就非常明显了。
定义结构体实现的代码如下。
# include <stdio.h>
typedef struct{
int max;
char c;
}Array;
Array ChildString(char *p)
{
Array result;
int stringlen=0,len=1,maxlen=1;
int i=0,j=1;
char *q;
q = p;
while(*q != '\0')
{
stringlen++;
q++;
}
while(i < stringlen)
{
if(*(p+i)==*(p+j) && j < stringlen)
{
len++;
}
else
{
if(len > maxlen)
{
maxlen = len;
result.c = *(p+i);
}
len = 1;
}
i++;
j++;
}
result.max = maxlen;
return result;
}
void main()
{
Array result;
char a[100];
printf("Please input a string: \n");
gets(a);
result = ChildString(a);
printf("The longest child string is : \n");
for(int i = 0; i < result.max; i++)
printf("%c",result.c);
printf("\n");
}
程序运行结果如下图所示。
当然也可以在主函数中修改代码,可以让用户循环输入,直到输入特定的字符串后退出,如下图所示。
以上就是函数返回多个值应用的几种简单方法,希望本文对你有帮助!