2012-10-10 13 views
5

Mam ten ciąg:C++ podciąg powrocie błędne wyniki

std::string date = "20121020"; 

robię:

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"; 

Ale im uzyskiwanie:

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

Zauważ, że miesiąc powinien być 10, nie 1020. Pozycje są poprawne, wypróbowane wszystko, to się nie udaje?

+12

Drugi argument to długość podłańcucha, a nie indeks końcowy. –

+5

'std :: string date = 20121020' jest niepoprawny składniowo. Czy chodziło Ci o 'std :: string date =" 20121020 "'? –

+2

@ Daniel Fisher, równie dobrze może to zrobić, ponieważ jest to dokładnie problem. – Chad

Odpowiedz

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

Drugi argument jest nieprawidłowy. Podajesz: "Podaj mi jako podciąg znaków , zaczynając od pozycji 4."

Prawdopodobnie chcesz:

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

Dzięki, że zadziałało, myślałem, że substr będzie jak plaster Pythona, a ty musisz przejść pozycje :) Jeszcze raz – jviotti

+1

@JuanCruzViotti: Nie ma to jak czytanie dokumentacja ... –

3

Spróbuj tego:

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"; 

wierzę substr bierze początek i długość jako argumenty.

+0

To był błąd, myślałem, że składnia substr będzie jak cięcie Pythona, a argumenty gdzie obie pozycje ciągu, Dzięki. – jviotti

-1

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

ciąg substr (size_t poz = 0, n = size_t ONP) const;

pos Pozycja znaku w bieżącym obiekcie tekstowym, który ma być użyty jako znak początkowy dla podciągu. Jeśli przekazana pozycja minie koniec łańcucha, zostanie zgłoszony wyjątek out_of_range.

n Długość podciągu. Jeśli ta wartość spowodowałaby, że podłańcuch obejmowałby koniec aktualnej treści ciągu, używane są tylko te znaki, aż do końca ciągu znaków. npos jest stałą wartością elementu o największej możliwej wartości dla elementu typu size_t, dlatego też, gdy ta wartość jest używana, wszystkie znaki między pozycją a końcem łańcucha są używane jako substrat inicjalizujący.

Więc twoim błędem w kodzie jest to, że spodziewałeś się, że drugi parametr będzie pozycją ostatniego znaku, zamiast długości podciągu.

+0

Jeśli podajesz dokumentację, podaj en.cppreference.com zamiast cplusplus.com.ten ostatni zna niespójności i błędne informacje. –

+0

Dzięki, dobrze wiedzieć. W każdym razie dla tej sytuacji sprawdziłem informacje i uznałem, że jest to słuszne, z mojego punktu widzenia nie jest tak naprawdę istotny dla informacji, o ile informacja jest poprawna. Na tej stronie wskazanej przez Ciebie wyjaśnienie jest krótsze, co nie zawsze jest dobre, gdy chcesz wyjaśnić coś komuś innemu. –