std :: string 비교 (문자열이 다른 문자열로 시작하는지 확인)


90

std : string이 "xyz"로 시작하는지 확인해야합니다. 전체 문자열을 검색하거나 substr ()을 사용하여 임시 문자열을 만들지 않고 어떻게합니까?

답변:


164

비교 방법을 사용합니다.

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

3
단순히 s.compare (t)를 사용하지 않는 이유는 무엇입니까?
Franck Mesirard

5
@FranckMesirard : 기본적으로 비교 는 전달 된 문자열의 전체 길이를 멤버 데이터와 비교하려고 시도하고 false를 반환하는 반면 전달 된 매개 변수의 길이로 길이를 제공하면 true를 반환하기 때문입니다 (즉, std :: basic_string :: compare , offset & length와 함께 사용하면 다른 라이브러리에서 String.BeginsWith ()처럼 사용할 수 있습니다.) 오프셋과 길이가 없으면 사실이 아닙니다.
legends2k 2011

1
t가 비어 있으면 true를 반환합니다.
gliderkite 2012-07-06

14
@gliderkite 당연히 ... 빈 문자열은 모든 문자열의 초기 접두사입니다.
Jim Balter 2014

1
정확해야합니다 ... 빈 문자열을 배제하려는 경우 : if (! t.empty () &&! s.compare (0, t.length (), t))
ericcurtin

14

표준 라이브러리의 정신에 더 부합 할 수있는 접근 방식은 자신 만의 starts_with 알고리즘을 정의하는 것입니다.

#include <algorithm>
using namespace std;


template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
    return input.size() >= match.size()
        && equal(match.begin(), match.end(), input.begin());
}

이는 클라이언트 코드에 대한 더 간단한 인터페이스를 제공하며 대부분의 표준 라이브러리 컨테이너와 호환됩니다.


멋있는! 이것은 부스트를 위해 추가되어야합니다!
David

2
@David : boost가 허용 된 종속성 인 경우 boost :: algorithm :: starts_with — 'Starts with'술어
Gabor

10

starts_with, istart_with (대소 문자 구분 안 함) 등과 같은 유용한 기능이 많이 있는 Boost의 String Algo 라이브러리를 살펴보십시오 . 프로젝트에서 boost 라이브러리의 일부만 사용하려는 경우 bcp 유틸리티를 사용하여 복사 할 수 있습니다. 필요한 파일 만


4

std :: string :: starts_with가 C ++ 20 내부에있는 것 같지만 std :: string :: find를 사용할 수 있습니다.

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

1
이것은 std::string::compare크기를 찾기 위해 리터럴 자체를 반복하지 않고 문자열이 리터럴로 시작하는지 쉽게 확인할 수 있기 때문에 허용되는 대답보다 훨씬 낫습니다 . 그리고 C ++ 20 직접 솔루션을 알려 주셔서 감사합니다.
Ruslan

s1이 s2로 시작하지 않으면 나중에 일치 시키려고 시도합니다. 이는 compare ()만큼 좋지 않습니다.
A117 '

0

귀하의 질문을 완전히 이해하지 못하는 것 같습니다. 사소한 것 같습니다.

s[0]=='x' && s[1]=='y' && s[2]=='z'

이것은 (최대) 처음 세 글자 만 봅니다. 컴파일 타임에 알려지지 않은 문자열을 일반화하려면 위의 내용을 루프로 대체해야합니다.

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}

글쎄, 나는 C 함수를 사용하여 문자열을 비교하는 방법을 알고 있습니다. 내 질문은 C ++ STL을 사용하여 객체 지향 방식으로 수행하는 것에 관한 것이 었습니다.
jackhab

여기에는 C 기능이 사용되지 않습니다. 그리고 표준 라이브러리는 당신이 당신 자신의 unctions를 작성하는 것을 배제하지 않습니다.

6
t가 s보다 짧으면 어떨까요?
vidstige 2013 년

@jackhab STL의 저자는 "STL은 객체 지향이 아닙니다. 객체 지향은 인공 지능만큼이나 가짜라고 생각합니다."라고 말합니다. - stlport.org/resources/StepanovUSA.html
짐 Balter

1
@vidstige 그런 다음에서 종료 NUL을 만나면 루프가 종료됩니다 t.
Jim Balter 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.