У чым розніца паміж масівамі знакаў і радком C?


адказ 1:

Масіў сімвалаў - непасрэдны прамежак памяці, які аналізуецца як 8-бітны байт. Памер фіксуецца пры стварэнні, і гэта гарантуе, што адзін знак захоўваецца ў кожным байце.

У гэтым выпадку сімвалам з'яўляецца любая 8-бітная двайковая лічба ад 00000000 (0x00 шаснаццатковай) да 11111111 (шаснаццатковая 0xFF).

масіў знакаў [100]; / * Масіў 100 знакаў [0] для масіва [99] * /

Радок пераменнага току выкарыстоўвае масіў char для захоўвання. Радок C можа быць ад 0 да даўжыні масіва мінус 1 сімвал.

Каб быць максімальна сфармаваным, масіў можа ўтрымліваць толькі мноства байтаў, якія прадстаўляюць сапраўдныя сімвалы ў наборы знакаў, якія будуць выкарыстоўвацца. Гэта часта ASCII або UTF-8. Усе іншыя байты могуць быць недапушчальныя пры друку або інтэрпрэтацыі радка.

Радок мае ярлык (зменную), які ўяўляе сабой тып паказальніка знака (char *), які змяшчае адрас масіва.

Радок мае NULCHAR ('\ 0', шаснаццатковы 0x00), які заканчвае радок пасля апошняга знака ў радку.

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

Неадкладная радок запісваецца ў падвоеныя двукоссі ў зыходным кодзе і прымушае стварыць масіў знакаў з запаўненымі знакамі і захоўваць у адмысловым месцы для чытання радкоў і вяртаць паказальнік на іх. Гэта "цукар сінтаксісу кампілятара" і спрашчае выкарыстанне такіх радкоў. NULCHAR аўтаматычна дадаецца да масіва, каб зрабіць яго добра сфармаваным радком.

char * s = "непасрэдны радок"; printf ("% s \ n), s);

Усе стандартныя функцыі радкі бібліятэкі C перадаюць радкі як сімвалы і мяркуюць, што "\ 0" прысутнічае.

"Ўзламанне", якое выкарыстоўваецца даволі універсальна, заключаецца ў тым, што пры звароце да масіва ён таксама служыць паказальнікам на першы элемент масіва. і наадварот.

char * x = "abcdefgh"; printf ("х 4-й знак:% c \ n", x [3]); х чацвёрты сімвал: d / * устаўце радок у масіў знакаў * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", а); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Нягледзячы на ​​такую ​​гнуткасць, масіў знакаў і радок C непасрэдна не сумяшчальныя.

char s [10]; s = "abcdefghi"; / * error * / // error: Несумяшчальныя тыпы пры прызначэнні тыпу 'char [10]' тыпу 'char *' "abcdefghi" з'яўляецца непасрэдным радком і вырашаецца ў паказальнік на "a" ў масіве, створаным для яго. Прызначэнне s не працуе, таму што масівы char не могуць быць прызначаны.

Масівы на самай справе не першакласны тып C. Яны не могуць быць скапіяваны непасрэдна, у іх няма аперацый на ўзроўні масіва і г.д. Усё, што робіцца з масівамі на C, робіцца для індывідуальнага змесціва, а не як адзінка.

char s [10]; char * x = "abcdefghi"; / * '\ 0' знаходзіцца ў канцы * / strncpy (s, x, 10); / * капіруе кожны знак у масіў * /

адказ 2:

Масіўны сімвал - гэта структура дадзеных на мове праграмавання C: колькасць байтаў у памяці, у якіх можна захоўваць сімвалы. У кожнай з гэтых вочак вы можаце захаваць любы сімвал (напрыклад, 8-бітны байт, значэнне ад 0 да 255).

Радок у стылі C (як я тлумачу "c-string" у вашым пытанні) - адзін са спосабаў прадставіць "string" сімвалаў, які мова C вызначае як колькасць знакаў без нулявога байта (значэння) 0). Гэта прадстаўлена самімі знакамі з наступным нулявым байтам, таму даўжыня радка не павінна захоўвацца асобна. Параўнайце гэта з радком у стылі Паскаль, які прадстаўлены 16-бітным цэлым знакам без подпісу з наступнай колькасцю байтаў інфармацыі (такім чынам, радок Pascal складае 65535 або менш).

Масіўны сімвал - гэта структура дадзеных, радок у стылі C - гэта прадстаўленне дадзеных. Яны розныя жывёлы.

Масіўны сімвал можа ўтрымліваць радок у стылі C ці нешта іншае (напрыклад, ён утрымлівае карысную інфармацыю пасля нулявага знака альбо не ўтрымлівае нулявага знака зусім). і ўсё ж, вы ўсё яшчэ зможаце інтэрпрэтаваць яго як радок у стылі C (пакуль яна ўтрымлівае па меншай меры адзін нулявы сімвал). Радок у стылі C можа захоўвацца ў масіве знакаў альбо ў іншым месцы, а не ў масіве (напрыклад, частка памяці, даступная толькі для чытання, і таму не можа "захоўваць" іншыя значэнні).