2016-12-15 60 views
1

我創建將要訪問的用戶選擇這樣的一個網站,我用一個簡單的程序的if語句,如:如何在if語句中使用*通配符?

If (url == "http://") 
{ 
    cout << ("Connecting to ") << url; 
} 
else 
{ 
    cout << ("Invalid URL"); 
} 

我想知道我怎麼能過濾掉沒有按串不要以「http://」或「https://」開頭,我剛開始時會很感激。

+4

使用'find'並檢查它是否返回0. – NathanOliver

+0

@NathanOliver,但匹配像'otherstuffhttp:// otherstuff'的東西 – Max

+1

http://stackoverflow.com/questions/1878001/how-do-i -check-if-ac-string-starts-with-a-certain-string-and-convert -a-sub – Max

回答

1

一個明確的,但也不是特別快的方式,是使用(假設urlstd::string

if (url.substr(0, 7) != "http://" && url.substr(0, 8) != "https://"){ 
    /*I don't start with http:// or https:// */ 
} 

這裏我使用substr提取std::string然後使用重載!=操作開始。

請注意,如果url短於7個或8個字符,則行爲仍然是明確定義的。

您可以定義static const char HTTP[] = "http://"並使用sizeof(HTTP) - 1 & c。所以你不要硬編碼長度,但這可能會走得太遠。

爲了更一般性,您可以冒險進入正則表達式的模糊世界。請參閱std::regex

1

一個可能的選擇是將已知的啓動協議存儲到一個字符串向量中,然後使用該向量及其函數以及字符串函數執行測試,並且如果您的url是字符串對象,則比較容易。

#include <string> 
#include <vector> 

int main { 
    const std::vector<std::string> urlLookUps { "http://", "https://" }; 

    std::string url("https://www.home.com"); 

    unsigned int size1 = urlLookUps[0].size(); 
    unsigned int size2 = urlLookUps[1].size(); 

    if (url.compare(0, size1, urlLookUps[0]) == 0 || 
     url.compare(0, size2, urlLookUps[1]) == 0) { 
     std::cout << url << std::endl; 
    } else { 
     std::cout << "Invalid Address" << std::endl; 
    }     

    return 0; 
} 

編輯

您可以藉此下一步,把它變成一個簡單的功能

#include <string> 
#include <vector> 

void testUrls(const std::string& url, const std::vector<std::string>& urlLookUps) { 

    std::vector<unsigned int> sizes; 

    for (unsigned int idx = 0; idx < urlLookUps.size(); ++idx) { 
     sizes.push_back(urlLookUps[idx].size()); 
    } 

    bool foundIt = false; 
    for (unsigned int idx = 0; idx < urlLookUps.size(); ++idx) { 
     if (url.compare(0, sizes[idx], urlLookUps[idx]) == 0) { 
      foundIt = true; 
      break; 
     } 
    } 

    if (foundIt) { 
     std::cout << url << std::endl; 
    } else { 
     std::cout << "Invalid URL" << std::endl; 
    } 

} // testUrls 

int main() { 
    const std::vector<std::string> urlLookUps { "http://", "https://" }; 
    std::string url1("http://www.home.com"); 
    std::string url2("https://www.home.com"); 
    std::string url3("htt://www.home.com"); 

    testUrl(url1, urlLookUps); 
    testUrl(url2, urlLookUps); 
    testUrl(url3, urlLookUps); 

    return 0; 
} // main 

這樣你就可以同時通過URL的功能以及一個用戶可能想要自己填充的url協議容器。這樣該函數將搜索保存到字符串向量中的所有字符串。