0

次のコードがあるとします。

char url[63] = {'\0'};
scanf("%s", url);

そして、ユーザーはURLを送信するように求められます。http://、ftp://など、通常はurlの先頭にある文字を削除する必要があります...

次のような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ループの境界はあなたを困らせるでしょう。文字列の終わりを過ぎて2文字に見える可能性がありますが、私の変更により、その問題は少し悪化します。://最初に文字列の長さをチェックし、その後にいくつかの有用なデータが見つかる可能性のある文字列内のポイントを超えないようにする必要があります。つまり、が4文字より短いstrlen(url) - 4場合を除いて、ループを制限する必要があります。url

于 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 に答える