Jaký je rozdíl mezi znakovým polem a řetězcem c?


Odpověď 1:

Pole char je souvislé rozpětí paměti, které je analyzováno jako 8 bitové bajty. Je pevně stanovena velikost při vytváření a je zaručeno, že char se uloží do každého bajtu.

Char v tomto případě je jakákoli 8bitová binární číslice od 00000000 (0x00 hex) do 11111111 (0xFF hex).

pole char [100]; / * 100 znaků pole [0] až pole [99] * /

Řetězec C používá pro ukládání pole char. Řetězec C může mít délku od 0 do délky pole minus 1 znaky.

Aby bylo pole dobře tvarované, může pole obsahovat pouze podmnožinu bytů představujících platné symboly v znakové sadě, která se má použít. Často se jedná o ASCII nebo UTF-8.Všechny ostatní bajty nemusí být platné při tisku nebo interpretaci řetězce.

Řetězec bude mít popisek (proměnnou), což je typ znakového ukazatele (char *), který obsahuje adresu pole.

Řetězec bude mít řetězec NULCHAR ('\ 0', 0x00 hex) ukončující řetězec po posledním znaku řetězce.

znaky [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

'Okamžitý řetězec' je zapsán ve dvojitých uvozovkách ve zdrojovém kódu a způsobuje vytvoření pole char s vyplněnými znaky a umístěním do zvláštního řetězce pouze pro čtení a vrátí se na něj ukazatel. Toto je „syntaxový cukr“ od kompilátoru a usnadňuje použití takových řetězců. NULCHAR je automaticky připojen k poli, aby se z něj stal dobře vytvořený řetězec.

char * s = "okamžitý řetězec"; printf ("% s \ n), s);

Všechny standardní funkce řetězce C knihovny předávají řetězce jako char * s a spoléhají na přítomnost '\ 0'.

„Hackem“, který se používá všeobecně, je to, že označení pole se při přístupu zdvojnásobuje jako ukazatel na první prvek pole. a naopak.

char * x = "abcdefgh"; printf ("x 4th char:% c \ n", x [3]); x 4. char: d / * vložte řetězec do pole char * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Přes tuto flexibilitu nejsou pole char a řetězec C přímo kompatibilní.

znaky [10]; s = "abcdefghi"; / * chyba * / // chyba: nekompatibilní typy při přiřazování typu 'char [10]' od typu 'char *' "abcdefghi" je okamžitý řetězec a převede se na ukazatel na 'a' v poli vytvořeném pro něj. Přiřazení k tomu nefunguje, protože pole char nelze přiřadit.

Pole nejsou ve skutečnosti typem první třídy v C. Nelze je přímo kopírovat, nemají žádné operace na úrovni pole atd. Vše, co se dělá s poli v C, se děje na individuálním obsahu, nikoli jako na jednotce.

znaky [10]; char * x = "abcdefghi"; / * '\ 0' je na konci * / strncpy (s, x, 10); / * zkopíruje každý znak do pole * /

Odpověď 2:

Znakové pole je datová struktura v programovacím jazyce C: počet bajtů v paměti, do kterých můžete ukládat znaky. Do každé z těchto buněk můžete uložit libovolný znak (tj. Bajty 8 bitů, hodnota 0 až 255).

Řetězec ve stylu C (jak to ve vaší otázce interpretuji jako „c-řetězec“) je způsob, jak reprezentovat „řetězec“ znaků, definovaný jazykem C jako počet znaků bez nulového bajtu (hodnota 0). Toto je reprezentováno samotnými znaky následovanými nulovým bajtem, takže není třeba samostatně ukládat délku řetězce. Porovnejte to s řetězcem ve stylu Pascal, kde je představován 16bitovým celkovým číslem bez znaménka následovaným tímto počtem bajtů informací (takže délka řetězce Pascal je maximálně 65535).

Takže znakové pole je datová struktura, řetězec ve stylu C je reprezentace dat. Jsou to různá zvířata.

Pole znaků může obsahovat řetězec ve stylu C, nebo může obsahovat něco jiného (např. Obsahuje užitečné informace za nulovým znakem nebo vůbec neobsahuje nulový znak); a přesto byste jej přesto mohli interpretovat jako řetězec ve stylu C (pokud obsahuje alespoň jeden nulový znak). Řetězec ve stylu C může být uložen v poli znaků nebo může být uložen někde, nikoli v poli (např. Část paměti určená pouze ke čtení, a proto nemůže „ukládat“ jiné hodnoty).