函数返回多个值的应用

还是通过一个编程的例子来介绍函数返回多个值的应用。
举例:编写一个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");
}

程序运行结果如下图所示。
在这里插入图片描述
当然也可以在主函数中修改代码,可以让用户循环输入,直到输入特定的字符串后退出,如下图所示。
在这里插入图片描述
以上就是函数返回多个值应用的几种简单方法,希望本文对你有帮助!

猜你喜欢

转载自blog.csdn.net/weixin_42570192/article/details/132598208
今日推荐