C语言不定长字符串数组运用的一个例子

最近在工作中遇到一个问题:需要将一个或多个文件路径与某个结构体或结构体数组关联起来,以对结构体进行初始化。我需要为这个操作写一个统一格式的接口。中间遇到一些不太理解的地方,我参考了这篇文章:https://blog.csdn.net/xudongdong99/article/details/6723163 ,对二维数组的传参有有了更多的理解。其实说到底,这些都是技巧上的问题而已。

现在把我的代码抽象为最简化的形式,如下:


#include <stdio.h>

char buff1[3] = {'a', 'b', 'c'};
char buff2[1] = {'A'};

static const char fruit[][20] = {"apple", "banana", "orange"};
static const char animal[][20] = {"cat"};

void match(void)
{
	printf("  <----->  ");
}

int func1(char *buffer, int count, const char (*arg)[20])
{
	int i;
	printf("=============== %s ===============\n", __func__);
	for(i = 0; i < count; i++)
	{
		printf("(buff[%d] : %c)", i, buffer[i]);
		match();
		printf("(arg[%d] : %s)\n", i, arg[i]);
	}
	return 0;
}

int main(void)
{
	// func1(&buff1[0], sizeof(buff1)/sizeof(char), fruit);
	// func1(&buff2[0], sizeof(buff2)/sizeof(char), item);
	func1(buff1, sizeof(buff1)/sizeof(char), fruit);
	func1(buff2, sizeof(buff2)/sizeof(char), animal);
	printf("Done.\n");
	return 0;
}

这里buff1, buff2 为实际问题中需要进行初始化的结构体,fruit, animal 为实际问题的文件路径名,func1为需要完成的接口函数。

需要注意的是,形式上的统一,因为func1的第一个参数定为 char* 类型,所以对于buff2,不是写成 char buff2  = 'A' 这种更为常见的形式,而是 char buff2[1] = {'A'}。这样,我就能保证,在我使用buff2传入func1时,参数格式是 char* 而不是char。 其实也可以使用 &buff2[0] 这种形式传入。总之,这样保证了不管我使用的是fruit这样的具有多个字符串的数组,还是animal这样的只有一个字符串的数组,从形式来看,传入函数时是一致的。

对于 static const char animal[][20] = {"cat"}; 这一句也是一样的道理。

另外一点,函数参数中二维数组的第二维指定为固定的值( char (*arg)[20] ),是字符串数组传参常用的方法。也就是说,通常对于不定长的二维数组,我们尽可能只让第一维为不定长,这样可以简化很多操作。对于第二维也不定长的情况,可参考本文开头提到的那篇文章去理解,实际上是人工地去处理一个一维数组。

程序编译运行最终的结果如下:

猜你喜欢

转载自blog.csdn.net/Blazar/article/details/81146665
今日推荐