免费注册 查看新帖 |

Chinaunix

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

字符串分段 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-16 18:07 |只看该作者 |倒序浏览
在做一个嵌入式web服务器,现在要实现读取html发过来的信息,name1=value1&name2=nalue2&name2=nalue2&name3=nalue3&name4=nalue4&name5=nalue5&name6=nalue6&name7=nalue7&name8=nalue8
现在定义了2个数组,分别存放name和value
  char *argName[8];
  char *argValue[8];
c = getchar()
可以怎么将c分割,分别存放在这2个数组里啊?

论坛徽章:
0
2 [报告]
发表于 2010-08-17 09:03 |只看该作者
调用 strtok 或 strtok_r 可以实现字符串分割。

论坛徽章:
0
3 [报告]
发表于 2010-08-17 15:08 |只看该作者
我写了一段代码来演示一下如何使用strtok_r。代码很简单,有很多东西没有考虑。所以使用的时候要小心
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>


  5. #define MAX_WORD_COUNT  20
  6. #define MAX_WORD_SIZE   20


  7. int main()
  8. {
  9.     char str[] = "name1=value1&name2=value2&name3=value3&name4=value4&name5=value5&name6=value6&name7=value7&name8=value8";
  10.     char *delim = "&";
  11.     char *argName[8];
  12.     char *argValue[8];
  13.     char *strtmp;
  14.     char *saveptr;
  15.     char *tok;
  16.     int i;
  17.     int n;
  18.     char words[MAX_WORD_COUNT][MAX_WORD_SIZE];  // 定义一个字符数组来保存分割后的字符串

  19.     memset(words, 0, sizeof(words));

  20.     /* 复制源字符串,因为 strtok/strtok_r 函数会修改源字符串
  21.      */
  22.     strtmp = strdup(str);
  23.     if (strtmp == NULL) {
  24.         return -1;
  25.     }

  26.     // 获得第一个子串
  27.     n = 0;
  28.     tok = strtok_r(strtmp, delim, &saveptr);
  29.     if (tok == NULL) {
  30.         return -2;
  31.     }
  32.     strncpy(words[n], tok, MAX_WORD_SIZE);         //复制子串到words数组
  33.     n++;

  34.     // 循环获得其他子串
  35.     do {
  36.         tok = strtok_r(NULL, delim, &saveptr);
  37.         if (tok == NULL) {
  38.             break;
  39.         }
  40.         strncpy(words[n], tok, MAX_WORD_SIZE);
  41.         n++;
  42.     } while (n < MAX_WORD_COUNT);


  43.     //for (i = 0; i < 8; i++) {
  44.     //    printf("words[%d]: %s\n", i, words[i]);
  45.     //}

  46.     // 分割 Name 与 Value
  47.     // 注意:分割后,argName[]与 argValue[]只是保存了一个字符串指针,真正的字符串保存在words数组里面!!!
  48.     delim = "=";
  49.     for (i = 0; i < 8; i++) {
  50.         argName[i] = strtok_r(words[i], delim, &saveptr);
  51.         argValue[i] = strtok_r(NULL, delim, &saveptr);
  52.     }

  53.     // 打印输出结果
  54.     for (i = 0; i < 8; i++) {
  55.         printf("argName[%d]: %s, argValue[%d]: %s\n", i, argName[i], i, argValue[i]);
  56.     }

  57.     free(strtmp);
  58.     return 0;
  59. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2010-08-23 09:47 |只看该作者
已经解决了

论坛徽章:
0
5 [报告]
发表于 2010-08-23 09:47 |只看该作者
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *html = "name1=value1&name2=nalue2&name2=nalue2&name3=nalue3&name4=nalue4&name5=nalue5&name6=nalue6&name7=nalue7&name8=nalue8";
    char str[512];
    char *argName[8];
    char *argValue[8];
    char *delim = "&=";
    char *tok;
    int i;

    for (i=0; i<8; i++)
    {
        argName[i] = malloc(64);
        argValue[i]= malloc(64);
    }

    strcpy(str, html);
    tok = strtok(str, delim);
    for (i=0; i<8 && tok!=NULL; i++)
    {
        strcpy(argName[i], tok);
        tok = strtok(NULL, delim);
        if (tok == NULL)
            break;
        strcpy(argValue[i], tok);
        tok = strtok(NULL, delim);
    }

    for (i=0; i<8; i++)
    {
        printf("%d: %s, %s\n", i, argName[i], argValue[i]);
    }
    for (i=0; i<8; i++)
    {
        free(argName[i]);
        free(argValue[i]);
    }
    return 0;
}

论坛徽章:
0
6 [报告]
发表于 2010-08-23 09:48 |只看该作者
再发一个url解码的程序

论坛徽章:
0
7 [报告]
发表于 2010-08-23 09:49 |只看该作者
#include <stdio.h>
#include <string.h>

char hexToChar(char *argv)
{   
   char digit;
   digit = (argv[0] >= 'A' ? ((argv[0]&0xdf) - 'A') + 10argv[0] - '0'));
   digit *= 16;   
   digit += (argv[1] >= 'A' ? ((argv[1]&0xdf)-'A') +10 argv[1] - '0'));
   return digit;
}

void unEscapeUrl(char *url)
{
   register int i,j;
   for(i = 0,j = 0; *(url+j);++i,++j){
      if((*(url + i) = *(url + j)) == '%'){
         *(url + i) = hexToChar(url + j + 1);
         j += 2;
      }
   }
   *(url + i) = '\0';
}

int main( )
{
   char url[20];
   printf("lease enter a url string\n";
   scanf("%s",url);
   unEscapeUrl(url);
   printf("%s\n",url);
   return 0;
}

论坛徽章:
0
8 [报告]
发表于 2010-08-24 16:24 |只看该作者
libcurl 方便
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP