[C语言] 利用库函数实现查找指定键值对功能

1. 功能描述

键值对(“key = value”)字符串,在开发中经常使用
要求1:请自己定义一个接口,实现根据key获取.
要求2:编写测试用例。
要求3:键值对中间可能有n多空格,请去除空格

注意:键值对字符串格式可能如下:
"key1 = value1"
"key2 =       value2"
"key3  = value3"
"key4        = value4"
"key5   =   "
"key6   ="

2. 所使用函数

  1. strstr()
    功能:查找母串中子串出现的位置
char *strstr( const char *string, const char *strCharSet );
// 参数: const char *string : 母串,存储字符串
// 		 const char *strCharSet : 用来在母串中查找的子串
// 返回值: 如果查询到结果,则返回指向第一次出现的位置
//		  如果未查询到结果,则返回空指针
  1. isspace()
    功能:判断当前字符是否为空格
int isspace(int c);
// 参数: int c: 传入字符的ascii值
// 返回值: 如果当前字符为空格,则返回非零0,如果不知,返回0

3. 思路

  1. 首先需要在一串字符串中,查找到所对应的key。
  2. 因为键值对是成对出现,所以还要继续判断该key后方是否有 ‘=’,如果有,则代表这是需要查找的键值对。
  3. 在key对应的value中,value前后可能存在空格,所以要去除value前后的空格。
  4. 得到key对应的value

4. 代码实现

/*
* getKeyByValue();
*   功能: 挑出键值对所对应的值
*   参数:
*		keyvaluebuf: 键值对
*		keybuf     : 所要查询的键名称
*		valuebuf   : 用于存放键所对应值的字符串
*		valuebuflen: 键所对应值的字符串的长度
*   返回值: 
*		成功: 0
*		失败: 非0
*/

/*
* trimSpace();
	功能获取非空字符串
	参数:
		inbuf:  原始字符串buf首地址
		outbuf: 非空字符串buf首地址
	返回之:
		成功:0
		失败:非0
*/

#include <stdio.h>
#include <ctype.h>

// 去除非空字符串
int trimSpace(char* inbuf, char* outbuf)
{
	if (inbuf == NULL || outbuf == NULL)
	{
		return -1;
	}

	char* p = inbuf;
	char* buf = outbuf;

	// 定义字符串vlaue的起点终点
	int begin = 0;
	int end = strlen(inbuf) - 1;
	int n = 0;

	// 因为键值对中间会有空格,所以要去除空格
	while ( isspace(inbuf[begin]) && (inbuf[begin] != NULL))
	{
		begin++;
	}

	while (isspace(inbuf[end]) && end > 0)
	{
		end--;
	}

	// 如果字符串为0 那么字符串不存在
	if (end == 0)
	{
		return -2;
	}


	// 记录字符串长度
	n = end - begin + 1;

	// 将字符串拷贝至vbuf,并通过形参返回至主函数
	strncpy(outbuf, inbuf + begin, n);

	return 0;
}

// 查找键所对的值,并且去除等号
int getKeyByValue(char* keyvaluebuf, char* keybuf, char* valuebuf, int* valuebuflen)
{
	if (keyvaluebuf == NULL || keybuf == NULL || valuebuf == NULL || valuebuflen == NULL)
	{
		return  -1;
	}

	char* kvbuf = keyvaluebuf;
	char* kbuf  = keybuf;
	char* vbuf  = valuebuf;

	// 查找键值,并跳转至后方继续查找
	// kbbuf = "= value"
	// "key4 = vluue " -> " =   value "
	kvbuf = strstr(kvbuf, kbuf);
	if (kvbuf == 0)
	{
		return -2;
	}
	kvbuf += sizeof(kbuf);

	//  查到 = 
	// 跳过 = 重新设置查找位置
	//  " =   value " -> "   value  "
	kvbuf = strstr(kvbuf, "=");
	if (kvbuf == 0)
	{
		return -3;
	}
	kvbuf += sizeof("=");

	// 取出非空字符串
	int ret = 0;
	ret = trimSpace(kvbuf, vbuf);
	if (ret != 0)
	{
		printf("trimSpace err:%d\n", ret);
		return -4;
	}

	// 获取长度,通过*间接赋值
	*valuebuflen = strlen(vbuf);

	return 0;
}

int main(void)
{
	char* keyvaluebuf = "key1 =         ";
	char* key         = "key1";
	char  value[100]  = { 0 };

	int valuelen = 0;
	int ret         = 0;

	ret = getKeyByValue(keyvaluebuf, key, value, &valuelen);
	if (ret != 0)
	{
		printf("getKeyByValue err:%d\n", ret);
		return ret;
	}

	printf("val = %s\nvaluebuflen = %d\n", value, valuelen);

	printf("\n");
	return 0;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值