substr în C++: poziție de început și lungime
Extrage corect fragmente din string: al doilea argument este lungimea, nu poziția finală. Verifică limitele, șirul gol și indicii de la zero.
În acest material
Funcția substr construiește un fragment dintr-un string. Primul argument indică poziția de început, iar al doilea indică numărul maxim de caractere cerute. Confuzia frecventă este interpretarea celui de-al doilea argument ca poziție finală.
Citește argumentele pe un exemplu
Pentru textul abcdef, apelul substr(2,3) produce cde: începe la indicele 2 și ia trei caractere. Nu produce doar caracterul de la poziția 2 până înainte de poziția 3. Numerotarea caracterelor începe de la zero.
Dacă ai un interval inclusiv [l,r], lungimea lui este r-l+1. Pentru intervalul cu capătul drept exclus [l,r), lungimea este r-l. Formula este corectă numai după ce ai verificat ordinea și limitele capetelor; scăderea unor poziții fără semn în ordine greșită poate produce un număr foarte mare.
Ce se întâmplă la finalul textului
Dacă lungimea cerută depășește caracterele rămase, fragmentul se oprește la sfârșitul șirului. Pentru același text, substr(4,10) produce ef. Aceasta nu înseamnă că orice poziție de început este acceptată.
Un început egal cu size produce șirul gol. Un început mai mare decât size provoacă excepția out_of_range. Prin urmare, verificarea poziției de început este distinctă de ajustarea lungimii. Când poziția provine din find, verifică întâi că nu este npos.
În abcdef, substr(2,3) începe la indicele 2 și copiază trei caractere: c,d,e. Capătul drept exclus este 5.Mărește schema ↗
Fragment nou, nu modificarea originalului
Apelul întoarce un string separat. Textul inițial rămâne același dacă nu îi atribui ulterior altă valoare. Pentru fragmente lungi sau multe extrageri într-o buclă, copierea caracterelor are un cost care trebuie inclus în analiza algoritmului.
Într-un tablou char[], copierea manuală a unui fragment trebuie să rezerve și loc pentru terminatorul nul. Lungimea utilă de trei caractere cere cel puțin patru poziții în șirul clasic rezultat. Nu trata capacitatea destinației ca detaliu opțional.
Verifică trei limite diferite
Testează o extragere din mijloc, una care ajunge la final și una cu lungime zero. Verifică separat începutul egal cu dimensiunea. Scrie pentru fiecare test poziția și lungimea dorite înainte de apel: astfel descoperi dacă ai confundat intervalul cu numărul de caractere.
Continuă cu reprezentarea textului, funcțiile pe șiruri și prelucrarea caracterelor.
Întrebări frecvente
Ce reprezintă al doilea argument al lui substr?
Numărul maxim de caractere cerute, nu indicele final. Pentru abcdef, substr(2,3) produce cde, pornind de la indicele 2 și luând trei caractere.
Ce se întâmplă dacă lungimea cerută depășește finalul textului?
Dacă poziția de început este validă, substr ia numai caracterele disponibile până la final. Nu adaugă caractere pentru a atinge lungimea cerută.
Pot apela substr cu o poziție mai mare decât size?
Nu ca operație validă: std::string::substr aruncă std::out_of_range pentru o poziție mai mare decât lungimea. Poziția egală cu size() este permisă și produce un șir gol.