我正在尝试通过C中的输入参数迭代,该参数正在以这样的方式存储在Char中:const char *page = argv[1];
现在,该参数将是一个HTTP地址,因此可能看起来像这样:
http://host:port/folder1/folder2/file.jpg
我想要的是:解析此字符串并将其分开与子字符串
char host = "host";
char port = "port";
char path = "/folder1/folder2/file.jpg";
char file = "file.jpg";
因此,我认为可以简单地计算出斜线数的数量可能会解决问题。
int slash_cnt = 0;
int i = 0;
for (i = 0, page[i] != ' ', i++)
{
if (strcmp(&page[i], "/"))
{
slash_cnt++;
}
}
但这不起作用。
如果有人可以在这里帮助我,甚至建议一种更好的方法来解析输入中指定的HTTP地址并相应地将其分开,我将非常感激!
strstr
可用于搜索分开感兴趣的部分的字符串//
,/
和:
。strrchr
可用于查找文件名之前的尾随/
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *page = "http://host:port/folder1/folder2/file.jpg";
char *slashes = "//";
char *slash = "/";
char *colon = ":";
char *start = NULL;
char *stop = NULL;
char *host = NULL;
char *port = NULL;
char *path = NULL;
char *file = NULL;
size_t span = 0;
if ( ( start = strstr ( page, slashes)) == NULL) {
fputs ( "could not find "//"n", stderr);
return 1;
}
start += strlen ( slashes);//move pointer so the slashes are excluded
if ( ( stop = strstr ( start, colon)) == NULL) {
fputs ( "could not find ":"n", stderr);
return 1;
}
span = stop - start;
if ( ( host = malloc ( span)) == NULL) {
fputs ( "malloc failedn", stderr);
return 1;
}
memmove ( host, start, span);
host[span] = ' ';
start = stop + strlen ( colon);
if ( ( stop = strstr ( start, slash)) == NULL) {
fputs ( "could not find leading "/"n", stderr);
return 1;
}
span = stop - start;
if ( ( port = malloc ( span)) == NULL) {
fputs ( "malloc failedn", stderr);
return 1;
}
memmove ( port, start, span);
port[span] = ' ';
span = strlen ( stop) + 1;
if ( ( path = malloc ( span)) == NULL) {
fputs ( "malloc failedn", stderr);
return 1;
}
memmove ( path, stop, span);
path[span] = ' ';
if ( ( start = strrchr ( page, slash[0])) == NULL) {
fputs ( "could not find trailing "/"n", stderr);
return 1;
}
start += strlen ( slash);
span = strlen ( start) + 1;
if ( ( file = malloc ( span)) == NULL) {
fputs ( "malloc failedn", stderr);
return 1;
}
memmove ( file, start, span);
file[span] = ' ';
puts ( host);
puts ( port);
puts ( path);
puts ( file);
free ( host);
free ( port);
free ( path);
free ( file);
return 0;
}