获取url参数值以某种格式编码
getting url param value encoded in some format
我写了下面的C代码来获取url参数的值
char *param(char *attribute_name) {
char *query_str = getenv("QUERY_STRING");
urlDecode(query_str);
printf("qstr = %s<br/>", query_str);
int i;
char *param_value;
char *temp = malloc(strlen(attribute_name) + 3);
char *x;
strcpy(temp, "?");
strcat(temp, attribute_name);
strcat(temp, "=");
x = strstr(query_str, temp);
attribute_name = strdup(attribute_name);
if (x == NULL) {
free(temp);
temp = malloc(strlen(attribute_name) + 3);
strcpy(temp, "&");
strcat(temp, attribute_name);
strcat(temp, "=");
x = strstr(query_str, temp);
}
if (x != NULL) {
param_value = malloc(strlen(x) - strlen(temp) + 1);
int s = strlen(x) - strlen(temp);
int t = strlen(x) - s;
strncpy(param_value, &x[t], 1);
for (i = strlen(temp) + 1; i <= strlen(x); i++) {
if (x[i] != '&') {
strncat(param_value, &x[i], 1);
} else {
break;
}
}
}
free(temp);
return param_value;
}
int urlDecode(char *str) {
unsigned int i;
char tmp[BUFSIZ];
char *ptr = tmp;
memset(tmp, 0, sizeof(tmp));
for (i=0; i < strlen(str); i++) {
if (str[i] != '%') {
*ptr++ = str[i];
continue;
}
if (!isdigit(str[i+1]) || !isdigit(str[i+2])) {
*ptr++ = str[i];
continue;
}
*ptr++ = ((str[i+1] - '0') << 4) | (str[i+2] - '0');
i += 2;
}
*ptr = ' ';
strcpy(str, tmp);
return 0;
}
下面是main()函数:
int main() {
printf("Content-type: text/htmlnrnr");
printf("<!Doctype html>");
printf("<html>");
printf("<meta charset="UTF-8"><meta http-equiv="Content-type" content="text/html; charset=UTF-8">");
printf("<body>");
char attr[] = "u";
char *value = param(attr);
puts(value);
//free(value);
printf("</body></html>");
return 0;
}
下面是我点击url: http://example.com/cgi-bin/cgi_param?u=1212&sa=232%203&sdd=jdwjdjw
后在浏览器上收到的输出qstr = u=1212&sa=232 3&sdd=jdwjdjw
�l12�
请纠正我哪里做错了?由于
这是我使用strstr
strchr
和memchr
所做的快速函数。这就是你要找的。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char *find_param(char *param, char *query_str) {
char *p, *p2, *value;
p = strchr(query_str, '?');
if (!p)
return NULL;
do {
p = strstr(p+1, param);
} while (p && p[strlen(param)] != '=');
if (!p)
return NULL;
p += (1 + strlen(param));
p2 = memchr (p, '&', strlen(p));
if (!p2)
p2 = p + strlen(p);
value = malloc(p2 - p + 1);
strcpy(value, p);
value[p2 - p] = ' ';
return value;
}
int main() {
printf("%s", find_param("u", "http://example.com/cgi-bin/cgi_param?u=1212&sa=232%203&sdd=jdwjdjw"));
return 0;
}
打印:
1212
也适用于sa
和sdd
。
我的代码中有一个逻辑错误。在做了以下修改后,运行正常。
来自:strcpy(temp, "?");
:
strcpy(temp, "");
谢谢你的建议
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- *新的编码器*格式和运算符
- 如何以 if else 或切换大小写格式对自动和编码?
- 为什么我在有关文件编码格式的QT代码中获得了混乱的代码
- 如何在C++中将文件编码格式设置为UTF8
- UTF 8 以 XML 格式编码的日语字符串
- LZW 编码和 GIF 文件格式
- 如果可以用IEEE 754中的二进制格式表示,那么硬编码浮点精确吗
- 获取url参数值以某种格式编码
- 我怎么能得到QT主函数argv参数作为unicode编码格式
- OpenCV imencode pgm 不能编码正确的格式