C 解析HTTP字符串
如何解析此字符串首先我需要检查C 解析HTTP字符串,c,string,http,parsing,get,C,String,Http,Parsing,Get,如何解析此字符串首先我需要检查STA,如果它存在,请继续扫描该字符串。在这种情况下,ID的Put值应存储在char数据类型中HelloWorld和Pass的值,在这种情况下,Testin123应存储在char数据类型中Pass 它应该首先确认字符串中是否存在STA。如果不存在,则不要进入循环。如果退出,则搜索ID和Pass。保存它 现在的问题是我无法存储ID和pass的值。也无法搜索STA char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.
STA
,如果它存在,请继续扫描该字符串。在这种情况下,ID
的Put值应存储在char数据类型中HelloWorld
和Pass
的值,在这种情况下,Testin123
应存储在char数据类型中Pass
它应该首先确认字符串中是否存在STA
。如果不存在,则不要进入循环。如果退出,则搜索ID
和Pass
。保存它
现在的问题是我无法存储ID
和pass
的值。也无法搜索STA
char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.1";
char *get = strtok(GetString, " ");
char *request = strtok(NULL, " ");
char *rtype = strtok(NULL, " ");
char *FirstPart;
int main()
{
if (request != NULL)
{
FirstPart = strtok(request,"/");
while(FirstPart)
{
if (!strncmp(part, "STA"))
{
//Print STA Found
if(!strncmp(part, "ID=", 3))
{
//Store value of ID
}
if(!strncmp(part, "Pass=", 5))
{
//Store the Pass
}
}
}
FirstPart =strtok(NULL,'/');
}
}
需要清理一下。提示:使用编译器打开所有警告和错误,它们的存在是有原因的。您的代码甚至没有编译,这是这里的最低条件 但尽管如此:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.1";
// you cannot do it globally in that way, so I pulled it all into main()
char *request, *FirstPart;
// please don't use all upper-case for normal variables
// I did it for some clarity here
char *ID, *PASS;
// skip "GET"
strtok(GetString, " ");
// get first part
request = strtok(NULL, " ");
if (request != NULL) {
FirstPart = strtok(request, "/");
// check for base condition
if (!strncmp(FirstPart, "STA", 3)) {
//Print STA Found
printf("STA = %s\n", FirstPart);
} else {
fprintf(stderr, "STA not found!\n");
exit(EXIT_FAILURE);
}
FirstPart = strtok(NULL, "/");
// graze the key-value combinations
while (FirstPart) {
// We check them all here, one after the other
if (!strncmp(FirstPart, "ID=", 3)) {
//Store value of ID
ID = strchr(FirstPart, '=');
// ID is now "=Test", so skip '='
ID++;
printf("ID = %s, value of ID = %s\n", FirstPart, ID);
} else if (!strncmp(FirstPart, "Pass=", 5)) {
//Store the Pass
PASS = strchr(FirstPart, '=');
// PASS is now "=123", so skip '='
PASS++;
printf("PASS = %s, value of PASS = %s\n", FirstPart, PASS);
} else {
printf("Unknown part \"%s\", ignoring\n", FirstPart);
}
FirstPart = strtok(NULL, "/");
}
} else {
fprintf(stderr, "No input at all\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
int main()
{
char GetString[]=“GET/STA/ID=Test/Pass=123 HTTP/1.1”;
//你不能用那种方式在全球范围内完成它,所以我把它全部放到main()中
字符*请求,*第一部分;
//请不要对正常变量使用所有大写字母
//我这样做是为了澄清
字符*ID,*PASS;
//跳过“获取”
strtok(GetString,“”);
//得到第一部分
请求=strtok(空,“”);
if(请求!=NULL){
第一部分=strtok(请求“/”;
//检查基本条件
如果(!strncmp(第一部分,“STA”,3)){
//找到打印STA
printf(“STA=%s\n”,第一部分);
}否则{
fprintf(stderr,“未找到STA!\n”);
退出(退出失败);
}
第一部分=strtok(空,“/”;
//轻擦键值组合
while(第一部分){
//我们在这里一一检查
如果(!strncmp(第一部分,“ID=,3)){
//存储ID的值
ID=strchr(第一部分“=”);
//ID现在是“=Test”,所以跳过“=”
ID++;
printf(“ID=%s,ID的值=%s\n”,第一部分,ID);
}否则如果(!strncmp(第一部分,“Pass=”,5)){
//储存通行证
PASS=strchr(第一部分“=”);
//PASS现在是“=123”,所以跳过“=”
PASS++;
printf(“PASS=%s,PASS的值=%s\n”,第一部分,PASS);
}否则{
printf(“未知部分\%s\”,忽略\n“,第一部分);
}
第一部分=strtok(空,“/”;
}
}否则{
fprintf(stderr,“完全没有输入”\n);
退出(退出失败);
}
退出(退出成功);
}
指针
ID
和PASS
仅指向以null结尾的值,它们不是独立的内存。您可以使用malloc()
获取一些,并使用strlen()
测量金额。以ID
为例:ptr_to_mem_for_ID=malloc(strlen(ID))代码>这是一个奇怪的停止位置,您正确地进行了标记化,但没有使用strcmp测试字符串是否相等?@covener我添加了完整的代码。问题是小错误隐藏了您的大错误。对strncmp的调用无效,没有长度参数。对strtok的调用无效,第二个参数为字符,应该是字符串。您的while循环正在逐步遍历令牌,但仅当该令牌为“STA”时才执行任何操作,但如果是,则检查它是否是其他的,但您知道它是“STA”,因此其他if子句无法匹配。这是学校项目吗?如果是,请忽略我的评论<代码>strtok
不是线程安全的。如果您运行的是并发web服务器,那么您可能会遇到这样难以调试的问题。如果可能的话,我会避免这些功能。我也会考虑使用一个现有的库来实现这一点,一个写得很差的自定义解析器的成本可能会比事后审查完全解析的HTTP请求的成本高。@ MySt不,这不是一个学校项目。我需要可靠的方法来解析字符串。图书馆的任何链接都会有很大的帮助!