Apakah perbezaan di antara pelbagai watak dan c-string?


Jawapan 1:

Satu array char adalah span memori yang disambungkan yang diasingkan sebagai 8 bit bytes.Ia ditetapkan dalam saiz pada penciptaan, dan dijamin menyimpan char di setiap bait.

A char dalam kes ini adalah sebarang digit biner 8-bit dari00000000 (0x00 hex) hingga 11111111 (0xFF hex).

array char [100]; / * 100 chars array [0] to array [99] * /

A-string menggunakan senarai char untuk penyimpanan. A-string boleh dari 0 hingga panjang array minus 1 aksara panjang.

Untuk dibentuk dengan baik, array mungkin hanya mengandungi subset ofte byte yang mewakili simbol yang sah dalam watak yang akan digunakan. Selalunya ini ASCII atau UTF-8.Begit lain mungkin tidak sah semasa mencetak atau menafsirkan rentetan.

Rentetan akan mempunyai label (pembolehubah) yang merupakan jenis penunjuk aksara (char *) yang mengandungi alamat array.

Rentetan itu akan mempunyai NULCHAR, ('\ 0', 0x00 hex) menamatkan rentetan, selepas watak terakhir rentetan.

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

'Rentetan segera' ditulis dalam petikan berganda dalam kod sumber dan menyebabkan array char dengan karakter yang diisi untuk dicipta dan dimasukkan ke dalam lokasi ingatan baca khusus rentetan khusus, dan penuding kepadanya dikembalikan. Ini adalah "gula sintaks" oleh pengkompil dan menjadikannya mudah untuk menggunakan tali sedemikian. NULCHAR secara automatik dimasukkan ke dalam array untuk menjadikannya rentetan yang terbentuk dengan baik.

char * s = "rentetan segera"; printf ("% s \ n), s);

Semua fungsi string perpustakaan C standard lulus rentetan sebagai char * s, dan bergantung pada '\ 0' yang hadir.

Satu "hack" yang digunakan secara adil adalah bahawa label suatu tatasusunan ketika mengakses ganda sebagai penuding ke elemen pertama array. dan begitu juga sebaliknya.

char * x = "abcdefgh"; printf ("x 4 char:% c \ n", x [3]); x 4 char: d / * meletakkan rentetan ke dalam array char * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); printc abcdefghijklmnop ("% s \ n", b); hijklmnop

Walaupun kelenturan ini, array char dan C-string tidak bersesuaian secara langsung.

char s [10]; s = "abcdefghi"; / * kesilapan * / // ralat: jenis yang tidak serasi apabila menyerah untuk menaip 'char [10]' dari jenis 'char *' "abcdefghi" adalah rentetan segera dan menyelesaikan kepada penuding ke 'a' dalam array yang dibuat untuknya. Menugaskan s kepadanya tidak berfungsi, kerana array arr tidak boleh diserahhakkan.

Array tidak benar-benar jenis kelas pertama dalam C. Mereka tidak boleh disalin secara langsung, mereka tidak mempunyai operasi peringkat seragam, dan lain-lain. Semua yang dilakukan dengan tatasusunan dalam C dilakukan pada kandungan individu, bukan sebagai satu unit.

char s [10]; char * x = "abcdefghi"; / * '\ 0' adalah pada akhir * / strncpy (s, x, 10); / * menyalin setiap char ke array * /

Jawapan 2:

Aras watak ialah struktur data dalam bahasa pengaturcaraan C: beberapa bait dalam memori di mana anda boleh menyimpan aksara. Anda boleh menyimpan sebarang aksara (iaitu, bait 8-bit, nilai 0 hingga 255) dalam setiap sel ini.

Struktur C-gaya (seperti yang saya tafsir "c-string" dalam soalan anda bermaksud) adalah cara untuk mewakili "rentetan" watak, yang ditakrifkan oleh bahasa C menjadi beberapa aksara tanpa null byte (nilai 0). Ini diwakili oleh watak-watak itu sendiri diikuti dengan byte null, sehingga tidak perlu memisahkan panjang rentetan secara berasingan. Sebarkan ini dengan rentetan gaya Pascal, di mana ia diwakili oleh integer 16-bit yang tidak ditandatangani diikuti oleh bilangan bait maklumat (supaya panjang rentetan Pascal paling banyak 65535).

Jadi array watak adalah struktur data, rentetan C-gaya adalah perwakilan data. Mereka adalah binatang yang berbeza.

Pelbagai aksara boleh memegang rentetan gaya C, atau ia mungkin memegang sesuatu yang lain (contohnya, ia mengandungi maklumat yang berguna selepas watak null, atau tidak mengandungi watak kosong sama sekali); dan walaupun anda mungkin dapat mentafsirkannya sebagai rentetan C-gaya pula (selagi ia mengandungi sekurang-kurangnya satu aksara null). Rentetan gaya C boleh disimpan dalam pelbagai aksara, atau ia mungkin disimpan di suatu tempat bukan suatu array (contohnya, bahagian baca sahaja memori dan dengan itu tidak boleh "menyimpan" nilai-nilai lain).