Проверьте, является ли одна строка префиксом другой - PullRequest
42 голосов
/ 27 октября 2011

У меня есть две строки, которые я хотел бы сравнить: String и String:. Есть ли библиотечная функция, которая возвращала бы true, если передать эти две строки, но false, например, для String и OtherString?

Если быть точным, я хочу знать, является ли одна строка префиксом другой.

Ответы [ 12 ]

0 голосов
/ 27 октября 2011

str1.find (str2) возвращает 0, если весь индекс str2 найден в индексе 0 для str1:

#include <string>
#include <iostream>

// does str1 have str2 as prefix?
bool StartsWith(const std::string& str1, const std::string& str2)
{   
    return (str1.find(str2)) ? false : true;
}

// is one of the strings prefix of the another?
bool IsOnePrefixOfAnother(const std::string& str1, const std::string& str2)
{   
    return (str1.find(str2) && str2.find(str1)) ? false : true;
}

int main()
{
    std::string str1("String");
    std::string str2("String:");
    std::string str3("OtherString");

    if(StartsWith(str2, str1))
    {
        std::cout << "str2 starts with str1" << std::endl;      
    }
    else
    {
        std::cout << "str2 does not start with str1" << std::endl;
    }

    if(StartsWith(str3, str1))
    {
        std::cout << "str3 starts with str1" << std::endl;      
    }
    else
    {
        std::cout << "str3 does not start with str1" << std::endl;
    }

        if(IsOnePrefixOfAnother(str2, str1))
        {
            std::cout << "one is prefix of another" << std::endl;      
        }
        else
        {
            std::cout << "one is not prefix of another" << std::endl;
        }

        if(IsOnePrefixOfAnother(str3, str1))
        {
            std::cout << "one is prefix of another" << std::endl;      
        }
        else
        {
            std::cout << "one is not prefix of another" << std::endl;
        }

    return 0;
}

Вывод:

  str2 starts with str1
  str3 does not start with str1
  one is prefix of another
  one is not prefix of another
0 голосов
/ 27 октября 2011

Я думаю, strncmp является наиболее близким к тому, что вы ищете.

Хотя, если перефразировать, вы можете искать strstr(s2,s1)==s2, что не обязательно является наиболее эффективным способом сделать это. Но вы не хотите работать n; -)

Хорошо, хорошо, версия на С ++ будет !s1.find(s2).

Хорошо, вы можете сделать его еще более мощным в C ++, примерно так: std::mismatch(s1.begin(),s1.end(),s2.begin()).first==s1.end().

...