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不,这不是一个学校项目。我需要可靠的方法来解析字符串。图书馆的任何链接都会有很大的帮助!