2016-12-15 5 views
1

Я создаю простую программу, которая собирается посетить веб-сайт пользователей, выбирающих поэтому я использую, если заявление, как:Как использовать символ * в выражении if?

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

И мне интересно, как я могу отфильтровать строки, которые Безразлично 't начинать с "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-some-string-and-convert-a-sub – Max

ответ

1

Четкий, но не особенно быстрый способ, заключается в использовании (при условии url является std::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

Возможная опция заключается в том, чтобы сохранить известные стартовые протоколы в вектор строк, а затем использовать этот вектор и его fuctions, а также функции строк для выполнения ваших тестов, и если ваш 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; 
} 

EDIT

Вы можете принять это к следующему шагу и превратить его в простой функции

#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, который пользователь может захотеть заполнить. Таким образом, функция будет выполнять поиск по всем строкам, которые сохраняются в векторе строк.