如何在if语句中使用*通配符?

时间:2016-12-15 13:05:36

标签: c++

我正在创建一个简单的程序,它将访问用户选择的网站,所以我使用if语句,如:

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

我想知道如何过滤出不以“http://”或“https://”开头的字符串,我刚刚开始这样的帮助将会受到赞赏。

2 个答案:

答案 0 :(得分: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&amp; c。所以你不要硬编码长度,但这可能会走得太远。

为了更加普遍,你可以冒险进入正则表达式的阴暗世界。请参阅std::regex

答案 1 :(得分: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协议容器。这样,该函数将搜索保存在字符串向量中的所有字符串。