String și caractere de caractere (c)

Un bloc care este specific numai sistemelor Microsoft

Pentru a crea o valoare dintr-un caracter literal fără prefix, compilatorul convertește un caracter sau o secvență de caractere între citate simple în valori pe 8 biți într-un număr întreg de 32 de biți. Câteva caractere în litera literă completează octeții corespunzători, după cum este necesar, de la ordinul ridicat la cel scăzut. Pentru a crea o valoare char, compilatorul acceptă un octet de ordin scăzut. Pentru a crea valoarea wchar_t sau char16_t, compilatorul acceptă cuvântul inferior. Compilatorul emite un avertisment că rezultatul este trunchiat dacă biții sunt setați deasupra octetului sau cuvântului desemnat.







O secvență de evacuare octal este o inversă lunecoasă urmată de o secvență de cifre octale (nu mai mult de trei). Secvența de evacuare cu opt cifre, care conține mai mult de trei cifre, este tratată ca o secvență octală de trei cifre, urmată de cifre care indică simboluri. Acest lucru poate duce la rezultate neașteptate. exemplu:

Dacă literalul extins literal cu prefixul L conține mai mult de un caracter, valoarea este luată de la primul caracter. Caracterele următoare sunt ignorate, spre deosebire de comportamentul unui literar obișnuit echivalent literal fără prefix.

Cu utilizarea denumirilor de caractere universale, nu este posibilă codarea valorilor în intervalul de puncte de cod surogat D800-DFFF. Pentru perechile surogate Unicode, specificați numele caracterului universal folosind \ UNNNNNNNN. unde NNNNNNNN este punctul de cod de opt caractere pentru simbol. Dacă este necesar, compilatorul va crea o pereche surogat.

În C ++ 03, limbajul a permis ca denumirile caracterului universal să reprezinte doar un anumit subset al caracterelor. De asemenea, ar putea exista nume de simbol universal care să nu reprezinte nici un caracter Unicode valabil. În standardul C ++ 11, acest neajuns a fost corectat. În C ++ 11, puteți folosi nume de simboluri generice în litere și identificatori de caractere și de caractere. Pentru mai multe informații despre numele simbolurilor generice, consultați Seturile de caractere. Pentru mai multe informații despre Unicode, consultați Unicode. Pentru mai multe informații despre perechile surogate, consultați articolul Perechile de suprasoriți și caracterele suplimentare (perechi de surogate și simboluri suplimentare).

Un literal șir reprezintă o secvență de caractere care formează împreună un șir cu zero zero. Caracterele trebuie să fie închise în ghilimele duble. Există următoarele tipuri de literali de șir.

Literali cu literatură îngustă

Un literal normal de șir este o matrice terminată cu nul de tip const char [n] fără un prefix, unde n este lungimea matricei în octeți. șir de caractere normal literal poate conține orice grafică, cu excepția ghilimele duble ( „), backslash (\) sau o linie nouă. Șirul de obicei literală poate conține, de asemenea, să scape de secvență și numele de caractere universale enumerate mai sus sunt plasate într-un octet.







Linii codate în UTF-8

Șirul în codificarea UTF-8 este o matrice terminator nul delimitat de ghilimele duble de tip const char U8 [n] prefixată, unde n - lungimea în octeți a șirului codificat. Un literal șir prefixat cu U8 pot conține simboluri grafice cu exceptia ghilimele duble ( „), un backslash (\) sau o nouă linie de caractere. Un șir literal U8 prefixat poate cuprinde, de asemenea, de evacuare, secvența de mai sus și orice nume de simboluri universale.

Litere de șir extins

Litera stringală extinsă este matricea null terminată a constantelor wchar_t. începând cu prefixul L. În această matrice poate include orice caractere grafice cu excepția dublu citat ( „), backslash (\) și newline. string avansat literal poate conține secvențe de evacuare și orice nume de caracter universal enumerate mai sus.

Literatura de litere netede (C ++ 11)

string Netratate literal -. Aceasta completează valoarea de zero a unui șir de caractere de orice tip, care poate include orice elemente grafice, inclusiv ghilimele duble ( „), Backslash (\) si un sir de caractere prime newline sunt adesea folosite în expresii regulate, care sunt utilizate . clase de caractere, și HTML și XML siruri de caractere pentru exemple, consultați următorul articol :. FAQ Bjarne Stroustrup pe C ++ 11 (Q & C ++ de Bjarne Stroustrup 11).

Separator - conține până la 16 de caractere de secvență personalizate, care se află chiar înainte de paranteza de deschidere și imediat după paranteza de închidere șir brut literal. De exemplu, în R „abc (Hello“ \ () abc „delimiters secventa - conținutul abc și rânduri - Hello“ \ (Distanțierele poate fi utilizat pentru a distinge rânduri neprelucrate care conțin ghilimele și paranteze linie următoare cauzează o eroare de compilator ..:

Literali std :: string (C ++ 14)

literali std :: string sunt literale de punere în aplicare personalizate pe baza biblioteca standard (a se vedea. de mai jos) și obținută prin adăugarea de prefixul „XYX“ s (cu sufixul s). Acest tip de un sir de caractere creează obiecte temporare, cum ar std :: string, std :: wstring, std :: u32string sau std :: u16string, în funcție de prefixul specificat. Dacă prefixul nu este utilizat, după cum se arată mai sus, este creat un obiect de tip std :: string. Dacă utilizați prefixul L „xyz“ s, creează un obiect de tip std :: wstring. Când se utilizează prefixul "xyz", este creat un obiect de tip std :: u16string. și prefixul U "xyz" s este un obiect de tip std :: u32string.

Rețineți că strlen () și wcslen () nu ia în considerare dimensiunea simbolului de închidere la zero, egală cu dimensiunea de tipul elementului șir: un octet la char * string, doi octeți pentru wchar_t * siruri de caractere și char16_t *, și patru octeți pentru siruri de caractere char32_t *.

Lungimea maximă a literalului șir este de 65535 octeți. Această restricție se aplică atât literalurilor de caractere înguste cât și celor de tip string.

Schimbarea literalurilor de coarde

Din moment ce literalurile de coarde sunt constante (cu excepția std: literali de șir), încercările de a le modifica (de exemplu: str [2] = 'A') duc la o eroare de compilator.

Un bloc care este specific numai sistemelor Microsoft

În Visual C ++, un literal șir poate fi folosit pentru a inițializa un pointer care nu este o valoare constantă de tip char sau wchar_t. Acest lucru este permis în codul C99, dar nu este recomandat în C ++ 98 și este eliminat din C ++ 11. O încercare de a schimba linia va cauza o încălcare a accesului, așa cum se arată în exemplul următor:

Pentru a spune compilatorului pentru a produce o eroare în convertirea unui șir de caractere parametru literal pointer non_const poate fi setat compilator / Zc: strictStrings (deconectare pune un sir de caractere). Se recomandă utilizarea acestuia pentru a crea un cod portabil care să respecte standardele. În plus, se recomandă declararea indicatoarelor inițializate de literalul șir folosind cuvântul auto. Astfel, are loc conversia la tipul corect (const). Următorul exemplu de cod interceptează la momentul compilării o încercare de a scrie la un literal șir:

Cuplarea literalurilor de coarde adiacente







Trimiteți-le prietenilor: