2012-10-10 2 views
5

내가이 문자열이 있습니다C++ 문자열 반환 잘못된 결과

std::cout << "** Date: " << date << "\n"; 
std::cout << "Year: " << date.substr(0,4) << "\n"; 
std::cout << "Month: " << date.substr(4,6) << "\n"; 
std::cout << "Day: " << date.substr(6,8) << "\n"; 

그러나 메신저 점점 :

std::string date = "20121020"; 

내가 뭘

** Date: 20121020 
Year: 2012 
Month: 1020 
Day: 20 

공지 달 10을해야한다고를, 아닙니다 1020. 자세가 정확하고, 모든 것을 시도했는데 실패 했습니까?

+12

두 번째 인수는 끝 색인이 아닌 부분 문자열의 길이입니다. –

+5

'std :: string date = 20121020'은 구문 상 올바르지 않습니다. 'std :: string date = "20121020"'을 의미 했습니까? –

+2

@ 대니얼 피셔 (Daniel Fischer)도 대답을 만들 수 있습니다. 그게 정확히 문제이기 때문입니다. – Chad

답변

14
std::cout << "Month: " << date.substr(4,6) << "\n"; 

두 번째 인수가 잘못되었습니다. " 자로 부분 4 자리부터 시작합니다."라고 지정하고 있습니다.

당신은 아마 원하는 :

std::cout << "Month: " << date.substr(4,2) << "\n"; 
+0

고마워요, 그 코드는 substr이 파이썬 슬라이스와 같을 것이라고 생각합니다. 위치를 고쳐야합니다 :) Thanks again – jviotti

+1

@JuanCruzViotti : 독서와 같은 것이 없습니다 설명서 ... –

3

이 시도 :

std::cout << "** Date: " << date << "\n"; 
std::cout << "Year: " << date.substr(0,4) << "\n"; 
std::cout << "Month: " << date.substr(4,2) << "\n"; 
std::cout << "Day: " << date.substr(6,2) << "\n"; 

나는 SUBSTR 인수로하고 길이을 시작한다 생각합니다.

+0

그건 실수 였는데, 나는 substr 구문이 파이썬 조각처럼 될 것이라고 생각했다. args는 문자열의 두 위치, 감사합니다. – jviotti

-1

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

문자열 SUBSTR (size_t와 POS = 0, N = 비영리를 size_t) CONST;

pos 하위 문자열의 시작 문자로 사용할 현재 문자열 개체의 문자 위치입니다. 전달 된 위치가 문자열의 끝을 지나면 out_of_range 예외가 발생합니다.

n 부분 문자열 길이. 이 값을 사용하면 하위 문자열이 현재 문자열 내용의 끝을지나도록 지정되며 문자열 끝까지 해당 문자 만 사용됩니다. npos는 size_t 유형의 요소에 대해 가능한 최대 값을 갖는 정적 멤버 상수 값이므로이 값을 사용하면 pos와 문자열 끝 사이의 모든 문자가 초기화 부분 문자열로 사용됩니다.

코드에서 실수로 두 번째 매개 변수가 부분 문자열의 길이 대신 마지막 문자의 위치가 될 것으로 예상했기 때문입니다.

+0

설명서를 인용 할 경우 cplusplus.com 대신 en.cppreference.com을 인용하십시오.후자는 불일치와 잘못된 정보를 가지고 있습니다. –

+0

고마워, 잘 알고있어. 어쨌든이 정보를 확인한 결과 저는 정보가 핵심 정보 인 한 내 견해로는 정보와 관련이 없습니다. 당신이 지정한 사이트에 이것에 대한 설명이 짧아서 다른 누군가에게 설명하고 싶을 때 항상 좋은 것은 아닙니다. –