我正在尝试迭代C中的输入参数,我将其存储在指向char的指针中:Caesar cipher? I much prefer Caesar salad!
现在这个参数将成为一个http地址,所以看起来像这样:
const char *page = argv[1];
我想要的是:解析此字符串并将其分隔为子字符串
http://host:port/folder1/folder2/file.jpg
所以我认为一个简单的for循环计算斜杠的数量,例如可能会成功。
char host = "host";
char port = "port";
char path = "/folder1/folder2/file.jpg";
char file = "file.jpg";
但这不起作用。
如果有人可以帮助我,或者甚至建议更好的方法来解析输入中指定的http地址并相应地分开它,我将非常感激!
答案 0 :(得分:0)
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 failed\n", stderr);
return 1;
}
memmove ( host, start, span);
host[span] = '\0';
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 failed\n", stderr);
return 1;
}
memmove ( port, start, span);
port[span] = '\0';
span = strlen ( stop) + 1;
if ( ( path = malloc ( span)) == NULL) {
fputs ( "malloc failed\n", stderr);
return 1;
}
memmove ( path, stop, span);
path[span] = '\0';
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 failed\n", stderr);
return 1;
}
memmove ( file, start, span);
file[span] = '\0';
puts ( host);
puts ( port);
puts ( path);
puts ( file);
free ( host);
free ( port);
free ( path);
free ( file);
return 0;
}