在C中解析URL

时间:2011-12-04 18:43:52

标签: c string parsing url

我正在尝试解析C中URL的几个元素。

这是网址的原型:

  

的ftp://并[d名称>:其中通过> @] LT;域> /< URL>“中;

问题是某些元素没有正确保存,例如我尝试在此处保存 ftp:// ftp [6] 。但是,当我打印它时,我会得到类似 ftp:/ d @ 的内容。这甚至不可能,因为阵列没有足够的空间。

int main()
{

   char ftp[6];
   char *name;
   char *pass;
   char *domain;
   char *url;
   char *var = "ftp://[coiso:pass@]teste/umgrandeurl";
   int x;
   int size_name;
   int size_pass;
   int size_domain;
   int size_url;
   int flag = 0;
   for (x = 0; x < strlen(var); x++) {

      if (x == 6) {
         strncpy(ftp, var, 6);
         if (strcmp(ftp, "ftp://") != 0) {
         }
      }

      if (var[x] == ':' && x > 3) {
         size_name = x - 7;
         name = (char *)malloc(size_name + 1);

         strncpy(name, &var[7], size_name);

      }

      if (var[x] == '@') {
         size_pass = x - (8 + size_name);
         pass = (char *)malloc(size_pass + 1);

         strncpy(pass, &var[8 + size_name], size_pass);

      }

      if (var[x] == '/' && x > 6 && flag == 0) {
         flag = 1;
         size_domain = x - (10 + size_pass + size_name);
         domain = (char *)malloc(size_domain + 1);
         strncpy(domain, &var[10 + size_pass + size_name], size_domain);

      }

      if (x == strlen(var) - 1) {
         size_url = x - (10 + size_pass + size_name + size_domain);
         url = domain = (char *)malloc(size_url + 1);
         strncpy(url, &var[11 + size_pass + size_name + size_domain], size_url);
         printf("%d", size_url);
      }

   }

   return 0;
}

编辑:嗯,同样的事情发生在我的传递中,但不是因为null char。

2 个答案:

答案 0 :(得分:2)

请尝试UriParse

,而不是构建自己的网址解析器

答案 1 :(得分:1)

来自手册页:

  

strncpy()函数类似,只是复制了最多n个字节的src。警告:如果之间没有空字节          在src的前n个字节中,放在dest中的字符串不会以空值终止

size_url=x-(10+size_pass+size_name+size_domain);
url=domain =(char*) malloc( size_url+1);
strncpy(url,&var[11+size_pass+size_name+size_domain],size_url+1);
                                                             ^^ 

...和其他尺寸类似/ strncpy()s。