0

假设我有以下代码:

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... 
     }
 }

但是说我想删除 :// 以及它之前的所有内容?我将如何做到这一点?这样如果用户输入:

http://www.google.com

输出将是:

www.google.com

如果使用 ftp:// 也会得到类似的结果。

4

3 回答 3

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;  
        }
    }
}

另外:更多检查错误案例!

于 2013-03-26T04:01:59.150 回答
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 个字符,否则要小心。

于 2013-03-26T04:02:33.717 回答
0
const char* ssc = strstr(url, "//:");
if (ssc)
{
   const char* withoutProtocol = ssc + 3;
   // do something with withoutProtocol
}
于 2013-03-26T04:09:54.670 回答