#include "stdlib.h"
#include "stdio.h"
#include "string.h"// 求去掉空格后的字符串
int trimSpaceStr(char* ptr, char* out_buf) {int ret = 0;int count = 0;int head, end;head = 0;end = strlen(ptr) - 1; // 注意:从0开始,所以要长度-1//printf("ptr[end]:%c\n", ptr[end]);//printf("strlen(ptr):%d, end:%d\n", strlen(ptr), end);while (isspace(ptr[head]) && ptr[head] != '\0') {head++;}while (isspace(ptr[end]) && end > 0) {end--;}//if ( end > head) { // 避免char* ptr = "    "; 字符串都是空格时,end - head为负数//    count = end - head + 1;//}count = end - head + 1;strncpy(out_buf, ptr + head, count);out_buf[count] = '\0';return ret;
}// 正确实例demo:
// C++工程项目,写代码思路逻辑清晰,让人看一眼能很快明白。
int getKeyByValue(char* pKeyValue, char* pKey, char* pValue) {int rv = 0;char* p = NULL;char buf[1024] = {0};  // 用于局部变量在函数内调试// 输入参数异常判断逻辑//if (pKeyValue == NULL || pKey == NULL || pValue == NULL) {//    rv = -1;//    printf("func getKeyByValue() err:%d pKeyValue == NULL || pKey == NULL || pValue == NULL\n", rv);//    return rv;//}if (pKeyValue == NULL) {rv = -1;printf("func getKeyByValue() err:%d pKeyValue is NULL\n", rv);return rv;}if (pKey == NULL) {rv = -1;printf("func getKeyByValue() err:%d pKey is NULL\n", rv);return rv;}if (pValue == NULL) {rv = -1;printf("func getKeyByValue() err:%d pValue is NULL\n", rv);return rv;}// 1,在pKeyValue中查找是否有关键字pKeyp = strstr(pKeyValue, pKey);if (p == NULL) {// pKeyValue字符串中未找到keyrv = -1;printf("func getKeybyValue() err:%d 没有关键字pKey:%s\n", rv, pKey);return rv;}p = p + strlen(pKey); // 为下次检索做准备// 2,有没有=等号p = strstr(p, "=");if (p == NULL) {// pKeyValue字符串中未找到=等号rv = -2;printf("func getKeybyValue() err:%d 没有=等号\n", rv);return rv;}p = p + 1; // 为下一次提取value做准备// 3,提取出value//rv = trimSpaceStr(p, buf);rv = trimSpaceStr(p, pValue);if (rv != 0) {printf("func trimSpaceStr err:%d\n", rv);return rv;}return 0;
}// 不推荐的写法-if,for深度嵌套逻辑:
// 工程项目上,会尽量避免if,for等等深度嵌套逻辑,这会让人看一眼还不明白逻辑。
int getKeyByValue01_Error(char* pKeyValue, char* pKey, char* pValue) {char rv = 0;char* p = NULL;char buf[1024] = { 0 };  // 用于局部变量在函数内调试// 1,在pKeyValue中查找是否有关键字pKeyp = strstr(pKeyValue, pKey);if (p != NULL) {p = p + strlen(pKey); // 为下次检索做准备// 2,有没有=等号p = strstr(p, "=");if (p != NULL) {p = p + 1; // 为下一次提取value做准备// 3,提取出value//rv = trimSpaceStr(p, buf);rv = trimSpaceStr(p, pValue);if (rv != 0) {printf("func trimSpaceStr err:%d\n", rv);return rv;}}}return 0;
}void main() {int ret = 0;char KeyValue[] = "key1=value1";char Key[] = "key1";char Value[1024] = {0};ret = getKeyByValue(KeyValue, Key, Value);if (ret != 0) {printf("func getKeyByValue() err:%d\n", ret);}printf("Value:%s\n", Value);system("pause");
}

C语言键值对(key-value)操作练习相关推荐

  1. hash表--c语言 字符串键值配对——(key, value)

    c语言键值配对--(key, value) 看一个C++项目时,其中解析配置文的部分引发了我的思考. 配置文件问普通字符文件,内容都是类似 如下: ipaddr=127.0.0.1 port=888 ...

  2. php使用redis生成自增序列号码,Redis使用Eval多个键值自增的操作实例

    在PHP上使用Redis 给多个键值进行自增,示例如下: $set['money'] = $this->redis->hIncrByFloat($key, $hour .'_money', ...

  3. python字典键值唯一_python字典操作详解

    python字典是一个无序.以键值对存储的数据类型,数据关联性强.唯一一个映射数据类型.键:必须是可哈希(不可变的数据类型:字符串.数字.元组.bool)值,并且是唯一的 None: none 是一个 ...

  4. 键值的 key 和 value 允许为null吗

       总结: HashMap对象的key.value值均可为null. HahTable对象的key.value值均不可为null.        两者的的key值均不能重复,若添加key相同的键值对 ...

  5. Mybatis 之 foreach 批处理 map 中的键值 为list 的操作

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach的第一篇用来将List和数组(array). 下面表格是我总结的各个属性的用途和注意点. foreach属 ...

  6. Spark 键值对RDD操作

    https://www.cnblogs.com/yongjian/p/6425772.html 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键 ...

  7. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  8. Redis中字符串string数据类型(保存(设置键值、过期时间、设置多个键值、追加值)、获取(获取单一键值、获取多个键值))

    字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的V ...

  9. React学习(3)——列表、键值与表单

    为什么80%的码农都做不了架构师?>>>    本文记录了在官网学习如何使用JSX+ES6开发React的过程. . 全文共分为3篇内容: JSX语法与React组件 状态.事件与动 ...

  10. python字典键值可以是元组或列表吗_Python列表、元组、字典、集合的内置使用方法...

    列表: 是一种可以存储多个值得数据容器 内容是有序的 可以存储任何数据类型 可以存储重复的元素 是可变类型(当内容发生变化时id不变) 元组: 也是一种可以存储多个值得数据容器 元组中的元素不可以被修 ...

最新文章

  1. Win2008虚拟化实战之Hyper-V快速设置
  2. ubuntu安装(owncloud-docker安装)
  3. gitblit如何迁移入gitlab合并迁移_github仓库迁移到gitlab以及gitlab仓库迁移到另一个gitlab服务器...
  4. python操作dom_Python Dom 的介绍和使用day1
  5. 使用iScroll实现上拉或者下拉刷新
  6. 网上读书关于软件测试,【读书笔记】之软件测试
  7. python的urllib2包基本使用方法
  8. ie 11 cookie 的值为空
  9. python动图自动识别,自动识别图像中的模式
  10. Linux下设置定期执行脚本
  11. linux下hg无法运行_linux下Mercurial Hg的配置方法
  12. 迅雷对电驴资源的限制
  13. 思维导图如何转换成图片
  14. [Python Nonebot]QQ机器人相关API / 网址介绍
  15. mysql salve从库设置read only 属性
  16. 2020年7月各大城市与程序员平均工资排行榜
  17. Javaweb基础-servlet应用1
  18. 五 、常用基本命令(重要)
  19. vscode无法打开浏览器预览解决方案
  20. 朋友圈一杠中间一个点_做好“五个一”,打造吸引人的朋友圈门面

热门文章

  1. 报 刊 集 锦(转载)
  2. Qt 中Socket编程实例
  3. 安卓手机小说阅读器_粉笔免费小说阅读器app下载-粉笔免费小说阅读器APP手机版v1.0.1...
  4. Android开发CompoundButton抽象类控件类的使用UI之Radio、Check、Toggle
  5. Jenkins非常详细的教程四(钩子程序,定时构建实现)
  6. ExtJS2.0实用简明教程——可编辑表格EditorGridPanel
  7. N81各种问题解决汇总
  8. Java解析魔兽争霸3录像W3G文件(一):Header
  9. 抽象代数学习笔记(抽象代数的历史、运算)
  10. 计算机唱歌按键学猫叫6,电脑键盘按键的功能介绍(最全的键盘各键及组合键功能说明)...