说我有以下代码:
char url[63] = {'\0'};
scanf("%s", url);
要求用户提交网址。我需要删除通常位于url开头的字符,例如http://,ftp://等...
我可以使用for循环检查字符数组中是否存在“://”:
int i;
for (i=0;i<strlen(url);i++) {
if (url[i] == ':' && url[i+1] == '/' && url[i+2] == "/") {
// Super cool code here...
}
}
但是说我想删除://以及之前的所有内容?我怎么做到这一点?因此,如果用户输入:
输出结果为:
www.google.com
如果使用了ftp://,则会得到类似的结果。
答案 0 :(得分:1)
您只需要:
int i;
for (i=0;i<strlen(url) - 2;i++) {
if (url[i] == ':' && url[i+1] == '/' && url[i+2] == '/') {
// Super cool code here...
return &url[i+3];
}
}
创建副本:
char* getInteresting(char* url)
{
int i = 0;
for (i=0;i<strlen(url) - 2;i++) {
if (url[i] == ':' && url[i+1] == '/' && url[i+2] == '/') {
// Super cool code here...
int len = strlen(url) - (i+2);
char* copy = (char*)malloc(len + 1);
strcpy(copy, url + i + 3);
return copy;
}
}
}
另外:通过错误案例进行更多检查!
答案 1 :(得分:1)
通常在C中执行此类操作的最简单方法是根本不实际更改原始数组,而是创建另一个char *
指针,指向您实际关注的字符串的第一部分。所以....
int i;
char *interesting_stuff;
for (i=0;i<strlen(url);i++) {
if (url[i] == ':' && url[i+1] == '/' && url[i+2] == "/") {
interesting_stuff = url + i + 3;
}
}
然后继续使用interesting_stuff
执行操作并单独留下url
。 (请注意,它是指向同一数组的指针,因此如果您覆盖url
,您也将失去interesting_stuff
。)
for
循环的界限会让你遇到麻烦。您可能会在字符串末尾看到两个字符,而我的修改会使问题变得更糟。您需要首先检查字符串的长度,并确保没有超过字符串中的://
后面有一些有用数据的点。换句话说,您希望将循环约束为strlen(url) - 4
,除非url
短于4个字符,否则请小心。
答案 2 :(得分:0)
const char* ssc = strstr(url, "//:");
if (ssc)
{
const char* withoutProtocol = ssc + 3;
// do something with withoutProtocol
}