嵌入式字符串解析自我批斗练习
1.解析url
第一次尝试
#include "stdio.h"
#include "string.h"// 输入: "?name=John&age=30&city=New%20York"
// 输出: {name: "John", age: "30", city: "New York"}
void parseUrlParams(char* url)
{char *arry[10],*clear,*prit;int i = 0;arry[i] = strchr(url,'=');while(arry[i] != NULL){i++;arry[i] = strchr(url,'=');}clear = strchr(url,'=');while(clear != NULL){*clear = NULL; }sscanf(prit,"{name: %s, age: %s, city: %s}",arry[0]+1,arry[1]+1,arry[2]+1);printf("%s",prit);
}void main(void)
{char *strin = "?name=John&age=30&city=New%20York";parseUrlParams(strin);
}
结果:段错误
错误原因:
1.字符串常量不能修改
在c语言中,字符串常量只存储在只读内存区。当尝试修改他们(*clear = NULL);时会导致段错误,可以使用拷贝的方式修改
2.strchar使用错误
arry[i] = strchr(url, ' = ');每次都从字符串开头寻找,会导致死循环因为寻找的都是同一个即第一个' ='
3.指针操作错误
*clear = NULL; 应该使用'\0'
4.指针操作错误
*clear = NULL 应该是'\0'
5.未初始化指针
sscanf(prit,...) 中 prit指针从未被赋值,会导致未定义行为
6.sscanf格式错误
7.url解码缺失
没有处理%20等url编码字符
答案:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
// 输入: "?name=John&age=30&city=New%20York"
// 输出: {name: "John", age: "30", city: "New York"}
void parseUrlParams(const char* url)
{if(*url == '?') url++;char *copy = strdup(url);char *token = strtok(copy,"&");printf("{");int frist = 1;while(token){char* eq = strchr(token,'=');if(eq){*eq = '\0';char *key = token;char *value = eq + 1;for(char *p = value; *p ; p++){if(*p == '%' && p[1] == '2' &&p[2] == '0'){*p = ' ';memmove(p+1,p+3,strlen(p+3)+1);}}if(!frist) printf(", ");printf("%s: \"%s\"",key,value);frist = 0;}token = strtok(NULL,"&");}printf("}\n");free(copy);
} void main(void)
{char *strin = "?name=John&age=30&city=New%20York";parseUrlParams(strin);
}