免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2148 | 回复: 2
打印 上一主题 下一主题

取字符串值的一个小函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-03 13:01 |只看该作者 |倒序浏览
配置文件里取值的一个小函数
经常需要读取像
title = xxxxx
ip = 192.168.13.65
size = 1000;
类似于这样的文件。

所以有了个函数。学艺不精, 也请坛上的各高手多多指教。
示例:
int main(int argc, char **argv)
{
        char *src1 = "title = abcdesf";
        char *src2 = "number = 100";

        int a;
        char b[1024];
       
        fsStr(b, src1, '=', 1);
        fsStr(&a, src2, '=', 0);
}



int fsStr(void *dst,  const char *src, char c, int cmd)
{
        if (src == NULL)
                return 0;

        char *pl;
        pl = strchr(src, c);
        if (pl == NULL)
                return 0;

        while(*(++pl) == ' ') { ; }
        if (cmd == 0)
                *(int*)dst = atoi(pl);

        if (cmd == 1)
                sscanf(pl, "%[^\n]", (char*)dst);

        return 0;
}

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2010-02-03 13:21 |只看该作者
配置文件里取值的一个小函数
经常需要读取像
title = xxxxx
ip = 192.168.13.65
size = 1000;
类似于这 ...
darkce 发表于 2010-02-03 13:01

  1. /*function:iscc 判断是否是汉字*/
  2. int iscc(unsigned char ch)
  3. {
  4.         return (ch >= 0x81 && ch < 0xff);
  5. }
  6. /*function:cc1 取汉字的一个字节*/
  7. static int cc1(unsigned char *bp,unsigned char *bufp)
  8. {
  9.         register unsigned char *p;
  10.         register int i = 0;
  11.         for(p = bufp; iscc(*p); p--)
  12.         {
  13.                 i++;
  14.                 if(p <= bp)
  15.                         break;
  16.         }
  17.         return (i & 1);
  18. }
  19. /*function:firstcc 汉字的第一个字节*/
  20. int firstcc(unsigned char *bp,unsigned char *bufp)
  21. {
  22.         if(!bufp || !(*bufp) || (bufp < bp) || !iscc(*bufp))
  23.                 return 0;
  24.         return (cc1(bp, bufp));
  25. }
  26. /*function:secondcc 汉字的第二个字节*/
  27. int secondcc(unsigned char *bp,unsigned char *bufp)
  28. {
  29.         if(!firstcc(bp, bufp-1))
  30.                 return 0;
  31.         if(*bufp == 0x7f)
  32.                 return 0;
  33.         if((*bufp >= 0x40) && (*bufp <= 0xfe))
  34.                 return 1;
  35.         return 0;
  36. }

  37. /************************************************************************/
  38. /*function:stptok 分解字符串为一组标记串                                        */
  39. /*description:根据分隔符'tok',从'src'分解到'trg'中,如果'tok'不设置,则*/
  40. /*根据'src'与len的最小值,将'src'拷贝到'trg'中。可以解决汉字中出现的与  */
  41. /*'tok'相同的分隔符被分解。                                                                                             */
  42. /************************************************************************/
  43. char *stptok(char *src,char *trg,int len,char *tok)
  44. {
  45.         register unsigned char *p;
  46.         if(trg) *trg = 0;
  47.         p = (unsigned char *)src;
  48.         if(!p || !(*p)) return src ;
  49.         if(tok && *tok) {
  50.                 while(*p) {
  51.         if(tok && *tok) {
  52.                 while(*p) {
  53.                         if(strchr(tok, *p)) {
  54.                                 if((p > (unsigned char *)src) && firstcc((unsigned char *)src, p-1)) {
  55.                                         p++;
  56.                                         continue;
  57.                                 }
  58.                                 break;
  59.                         }
  60.                         p++;
  61.                 }
  62.         } else {
  63.                 int l=strlen(src);
  64.                 if((len > 0) && (len < l))
  65.                         p = src + len;
  66.                 else p = src + l;
  67.         }
  68.         if(!trg || (len <= 1))
  69.                 return p;

  70.         while(*src && --len) {
  71.                 if((unsigned char *)src == p)
  72.                         break;
  73.                 *trg++ = *src++;
  74.         }
  75.         *trg = 0;

  76.         return src;
  77. }

复制代码
使用方法:

char buf[]="ABC= DEF + X";
char *p;
         p=buf;
         while (*p) {
          p=stptok(p,0,0,"+-*/%=");
         switch(*p) {
         case '=':
        case '+':
         case '-':
        case '*':
         case '/':
        case '%':
        default:
                  break;
        }
        p++;
      }

论坛徽章:
0
3 [报告]
发表于 2010-02-03 13:56 |只看该作者
有开源可以参考
http://www.compuphase.com/minini.htm
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP