как проверить начало строки в C ++ - PullRequest
47 голосов
/ 11 ноября 2011

Есть ли способ в C ++ проверить, начинается ли строка с определенной строки (меньше, чем оригинал)? Так же, как мы можем сделать в Java

bigString.startswith(smallString);

Ответы [ 12 ]

79 голосов
/ 11 ноября 2011
std::string s("Hello world");

if (s.find("Hello") == 0)
{
    std::cout << "String starts with Hello\n";
}
62 голосов
/ 11 ноября 2011

Вы можете сделать это с помощью string::compare(), который предлагает различные варианты для сравнения всех или частей двух строк. Эта версия сравнивает smallString с соответствующим префиксом размера bigString (и работает правильно, если bigString короче smallString):

bigString.compare(0, smallString.length(), smallString) == 0

Я склоняюсь к тому, чтобы обернуть это в бесплатную функцию под названием startsWith(), так как в противном случае это может выглядеть немного загадочно.

ОБНОВЛЕНИЕ: C ++ 20 добавляет новые starts_with и ends_with функции, так что вы, наконец, сможете писать только bigString.starts_with(smallString).

30 голосов
/ 11 ноября 2011

Подходы, использующие string::find() или string::substr(), не являются оптимальными, поскольку они либо делают копию вашей строки, либо ищут больше совпадений в начале строки.Это может не быть проблемой в вашем случае, но если это так, вы можете использовать алгоритм std::equal.Не забудьте проверить, что «стог сена», по крайней мере, такой же длины, как и «иголка».

#include <string>    

using namespace std;

bool startsWith(const string& haystack, const string& needle) {
    return needle.length() <= haystack.length() 
        && equal(needle.begin(), needle.end(), haystack.begin());
}
13 голосов
/ 11 ноября 2011

Правильное решение, как всегда, исходит от Boost: boost::algorithm::starts_with.

5 голосов
/ 15 мая 2014

Чтобы немного оптимизировать:

if ( smallString.size() <= bigString.size() &&
     strncmp( smallString.c_str(), bigString.c_str(), smallString.length() ) == 0 )

Не забудьте #include <cstring> или #include <string.h>

2 голосов
/ 05 мая 2018

С C ++ 20 вы можете использовать std::basic_string::starts_with (или std::basic_string_view::starts_with):

#include <string_view>

std::string_view bigString_v("Winter is gone"); // std::string_view avoids the copy in substr below.
std::string_view smallString_v("Winter");
if (bigString_v.starts_with(smallString_v))
{
    std::cout << "Westeros" << bigString_v.substr(smallString_v.size());
}
1 голос
/ 11 ноября 2011

Самый простой подход:

if ( smallString.size() <= bigString.size()
    && std::equals( smallString.begin(), smallString.end(), bigString.end() )

(Это также будет работать, если один из двух или оба является вектором. другой стандартный тип контейнера.)

0 голосов
/ 16 сентября 2017

Я удивлен, что никто еще не опубликовал этот метод:

#include <string>    
using namespace std;

bool starts_with(const string& smaller_string, const string& bigger_string) 
{
    return (smaller_string == bigger_string.substr(0,smaller_string.length()));
}
0 голосов
/ 08 декабря 2016

Я подумал, что имеет смысл опубликовать сырое решение, которое не использует библиотечные функции ...

// Checks whether `str' starts with `start'
bool startsWith(const std::string& str, const std::string& start) {
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) {
        if (start[i] != str[i]) return false;
    }
    return true;
}

Добавляя простое std::tolower, мы можем сделать этот регистр нечувствительным

// Checks whether `str' starts with `start' ignoring case
bool startsWithIgnoreCase(const std::string& str, const std::string& start) {
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) {
        if (std::tolower(start[i]) != std::tolower(str[i])) return false;
    }
    return true;
}
0 голосов
/ 11 ноября 2011

http://www.cplusplus.com/reference/string/string/substr/

Вы можете использовать string.substr (), чтобы увидеть любое количество символов из любой позиции, или вы можете использовать член string.find ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...