2012-10-10 21 views
5

ho questa stringa:C++ sottostringa di restituire i risultati errati

std::string date = "20121020"; 

sto facendo:

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

Ma nel mese di ottenere:

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

Si noti che il mese dovrebbe essere 10, non 1020. Le posizioni sono corrette, provato di tutto, cioè che sta fallendo?

+12

Secondo argomento è la lunghezza della sottostringa, non l'indice finale. –

+5

'std :: string date = 20121020' è sintatticamente errato. Intendevi 'std :: string date =" 20121020 "'? –

+2

@DanielFischer, potrebbe anche essere una risposta, perché è esattamente questo il problema. – Chad

risposta

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

Il secondo argomento è errato. Stai specificando "Dammi come sottostringa di caratteri, a partire dalla posizione 4."

probabilmente si vuole:

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

Grazie, ha funzionato, ho pensato che il substrato sarebbe come la slice di Python, e devi pas le posizioni :) Grazie ancora – jviotti

+1

@JuanCruzViotti: Non c'è niente come leggere la documentazione ... –

3

Prova questa:

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

Credo substr prende inizio e lunghezza come argomenti.

+0

Questo è stato l'errore, ho pensato che la sintassi del substr sia come il pitone slicing e gli args in cui entrambe le posizioni della stringa, grazie. – jviotti

-1

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

stringa substr (pos size_t = 0, size_t n = npos) const;

pos Posizione di un carattere nell'oggetto stringa corrente da utilizzare come carattere iniziale per la sottostringa. Se la posizione passata supera la fine della stringa, viene lanciata un'eccezione out_of_range.

n Lunghezza della sottostringa. Se questo valore renderebbe la sottostringa estendersi oltre la fine del contenuto di stringa corrente, verranno utilizzati solo quei caratteri fino alla fine della stringa. npos è un valore costante membro statico con il valore massimo possibile per un elemento di tipo size_t, pertanto, quando questo valore viene utilizzato, tutti i caratteri tra pos e la fine della stringa vengono utilizzati come sottostringa di inizializzazione.

Quindi il tuo errore nel codice è che ci si aspetta che il secondo parametro sia la posizione dell'ultimo carattere anziché la lunghezza della sottostringa.

+0

Se si cita la documentazione, si prega di citare en.cppreference.com anziché cplusplus.com.quest'ultimo ha conosciuto incongruenze e informazioni errate –

+0

Grazie, buono a sapersi. Ad ogni modo per questa situazione ho controllato le informazioni e ho trovato che è giusto, dal mio punto di vista non è veramente rilevante la sicurezza delle informazioni purché l'informazione sia corretta. Sulla base di questo sul sito specificato da voi la spiegazione è più breve che non è sempre una buona cosa quando si vuole spiegare qualcosa a qualcun altro. –

Problemi correlati